5

我試圖想出提出搜索建議的最快方法。起初,我認爲Levenstein UDF函數結合mysql表可以完成這項工作。但是使用levenshtein,mysql必須遍歷表中的每一行(噸的話),這將使查詢真的很慢。獅身人面像和「你的意思是...?」建議的想法。它的工作?

現在我最近安裝並開始使用Sphinx(http://sphinxsearch.com/)進行全文搜索,主要是因爲它的性能和與SphinxSE的緊密mysql集成。

所以我問自己,是否可以使用獅身人面像來實現一個「你的意思」算法來提高性能,我想我找到了一個簡單的方法。 基本上我把所有的關鍵字,我想糾正,把每個字母之間的空間,然後把它放在獅身人面像索引。如果這個詞是'關鍵字',它就變成'可以或不可以'。現在,當用戶輸入一個單詞時,我將它分成幾個字母,並在獅身人面像索引中搜索匹配任何提供的字母的記錄(我只需要一個)。最好的部分是獅身人面像非常適合計算匹配行的相關性(權重),所以最好的匹配總是會有最大的權重(我認爲)。它也包含單詞(在我的情況下是字母)的位置,所以最好的匹配將按照這個順序。

通過sphinx查詢,我可以在我的關鍵字列表中找到最相似的單詞。然後我使用擴展的Levenshtain距離來檢查它,這個距離佔重新排列的字母http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance。如果字符串距離小於2(且!= 0),則建議該字。否則,不要提出任何建議。

我的想法有問題嗎?我沒有想到的東西?任何期望的獅身人面像查詢故障,以及與獅身人面像相關性計算無法給出最佳匹配的怪癖?如果我在某處出錯,請糾正我。

回答

3

我看不到你的想法存在問題。去吧。只需指出,如果您想覆蓋與LD非常相似的內建行爲,則只有您的方法纔有用。

例如,對於sphinx 1.10-beta,您可以指定min_infix_len和expand_keywords,並使用sphinx的內置加權方法(BM25和一些專有代碼)以獲得良好結果。 http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/

不要忘記memcache這些查詢,並創建一個熱身腳本。

+0

謝謝,當我有時間,我會進一步看看它。 – stormbreaker 2011-03-02 16:41:00

0

我認爲這將是有趣的,你讀什麼安德魯Aksyonoff(獅身人面像的作者)認爲,關於通過實施獅身人面像這個任務 - http://habrahabr.ru/blogs/sphinx/61807/(使用翻譯從俄羅斯翻譯)

+0

我已經讀過,我的問題是我的想法是否按預期工作,或者我沒有考慮到。(順便說一下,我有一個基本的瞭解俄羅斯,所以不需要翻譯):) – stormbreaker 2011-02-15 10:11:04

0

您可以記錄輸入的每個搜索查詢以及用戶輸入的下一個搜索查詢。

讓我們假設很多用戶搜索rhinosorous,但實際上意味着犀牛。因爲用戶會更正他們的查詢,這意味着下一個查詢將會有大量的犀牛鼻孔查詢。

您可以選擇的建議是這樣的:

SELECT id, query, next_query, COUNT(id) AS count FROM queries GROUP BY query ORDER BY COUNT(id) DESC 

如果頂部結果具有count這是該關鍵字的所有查詢的高%,顯示一條消息。

我還沒有測試過,它只是一個想法。

相關問題