正如我已经阅读了很多部分,ngram索引可以改善Word搜索。
在这篇旧文章中,它说它可以适应mysql,但它没有说明如何:levenshtein alternative
有谁能举个例子,你可以在mysql中使用这种技术吗?
使用这种技术可以提高mysql的levenshtein函数的性能吗?.
我需要找到近似文本(如LevsTein)。
在mi测试中,我使用了levenshtein()和levenshtein_ratio()函数,它们来自:
http://www.artfulsoftware.com/infotree/qrytip.php?id=552
SELECT *, levenshtein_ratio('stacoverflou',words_column) AS ratio
FROM my_table
ORDER BY ratio DESC
提高性能(假设第一个字母没有拼写错误)
SELECT *, levenshtein_ratio('stacoverflou',words_column) AS ratio
FROM my_table
WHERE words_column LIKE 's%'
ORDER BY ratio DESC
我还发现了这个用于构建ngram的php库:
https://gist.github.com/Xeoncross/5366393
但我不知道如何在mysql中使用这些ngram
最佳答案
我终于自己做了一个算法:
生成ngrams算法:
我构建了一个包含3列的words表:ngrams(全文)、word(唯一)、lang
我使用Bigrams()函数为每个单词生成ngram
我在每个ngram中添加了一个字符填充,以跳过全文索引的最小字长,例如:“ab cd”应该是“ab bc cd”,但使用填充时它看起来像“abxx bcxx cdxx”
搜索算法:
我把客户写的单词当作正确的,并用它们在真实的表格中搜索
使用mysql全文搜索查询时使用对('+word_1+word_2+word_n'处于布尔模式)
如果得分(排名)>0,任务完成且未使用ngrams(向客户展示结果)
如果分数(排名)=0(可能拼错单词),则使用ngrams单词表检索正确的单词
从ngrams算法中检索正确的单词:
对于每个单词,生成ngram并使用words表(其中有ngrams列)执行全文搜索查询,并检索正确的单词。请注意,这里没有指向ngram的“+”前缀
像步骤4那样重建搜索
如果得分>0任务完成->显示结果->结束
如果分数仍然为0,则进行另一个查询,但这次不带“+”字首,并处于自然语言模式->显示结果->结束
步骤2代码:
// original from : https://gist.github.com/Xeoncross/5366393
// modified for working also with unicode characters
function Bigrams($word){
$ngrams = array();
$len = mb_strlen($word);
for($i=0;$i+1<$len;$i++){
$ngram = mb_substr($word, $i, 2);
while(mb_strlen($ngram) < 4){
$ngram .= "x";
}
$ngrams[$i]=$ngram;
}
return implode(" ",$ngrams);
}
步骤4代码:
SELECT my_column,
( MATCH(my_full_text_column )
AGAINST('+word_1 +word_2 +word_n' IN BOOLEAN MODE)
) AS score LIMIT 10
步骤7代码:
$word = "stacoverflou"; // Intentionally misspelled
$actual_word_ngrams = Bigrams();
//that return
//stxx taxx acxx coxx ovxx vexx erxx rfxx flxx loxx ouxx
SELECT word,
( MATCH( ngrams )
AGAINST('$actual_word_ngrams' IN BOOLEAN MODE)
) AS score LIMIT 1
返回stackoverflow an可以与ohers单词(如果有很多的话)一起使用,以便进行更精确的搜索,如步骤4所示
结束