2017-04-22 46 views
1

正如我在很多地方閱讀過的,ngram索引可以改善單詞搜索。 在這篇舊文章中,它說它可以適用於mysql,但它不會說如何:levenshtein alternativemysql ngrams索引示例

任何人都可以把一些例子,因爲你可以在MySQL中使用這種技術?

可以使用這種技術來提高mysql的levenshtein函數的性能嗎?

我需要的是找到近似的文字(如萊文斯坦)

在我使用萊文斯坦()和levenshtein_ratio()函數從MI測試: 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 

另外我發現這個PHP庫的建設ngrams: https://gist.github.com/Xeoncross/5366393

但我不知道如何在MySQL中使用這些n元語法

回答

1

我終於做出了算法自己:

生成的n-gram算法:

  1. 我建a words 3列表:ngrams(fullt EXT),(唯一的),
  2. 我用雙字母組()函數來使n元語法爲
  3. 我加入炭填充到每個的ngram跳過全文索引最小字長前每個字: 'ABCD' 應該是 'AB BC CD',但與填充它看起來像 'abxx bcxx CDxx可'

搜索算法:

  • 我採取客戶端寫入字作爲正確,並用它們在現實表 使用AGAINST(「+ word_1 + word_2 + word_n」在MySQL全文搜索查詢來搜索BOOLEAN MODE)

  • 如果分數(等級)> 0任務完成和n元語法不使用(顯示結果到客戶端)

  • 如果分數(等級)= 0(也許拼錯的單詞),然後使用n元語法單詞表檢索正確單詞

  • 從n元語法算法檢索正確的單詞:

  • 對於每個字生成n元語法和預製品使用AGAINST全文搜索查詢( 'abxx bcxx CDxx可' IN BOOLEAN MODE) FROM words表(我們有ngram列)並檢索正確的單詞。注意,這裏沒有(+)前綴的n-gram

  • 重建像搜索的步驟4

  • 如果評分> 0任務完成 - >顯示結果 - > END

  • 如果比分仍是0然後再次查詢,但這次沒有(+)+字首並在行文固有模式 - >顯示結果 - > END

  • 第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代碼:

    返回計算器一個可以與ohers字(如果許多)可用於更精確的搜索等作爲步驟4

    END