2011-05-13 65 views
2

我試圖實現基於關鍵字搜索的搜索引擎。 任何人都可以告訴我哪個是最好(最快)的算法來實現關鍵詞的搜索嗎?PHP使用關鍵字的MYSQL搜索引擎

我需要的是:

我的關鍵字:

search, faster, profitable 

它們的同義詞:

search: grope, google, identify, search 
faster: smart, quick, faster 
profitable: gain, profit 

現在我應該尋找上述同義詞的所有可能的排列在一個數據庫來識別大多數匹配詞。

+1

不要爲此使用MySQL。用戶像lucene或elasticsearch。 – blockhead 2011-05-13 05:14:39

+0

聽起來像你已經得到你的解決方案......你經歷列表中單詞的每個排列,並得到一個'SELECT ... WHERE ... LIKE $ permutation'。它應該只需要幾秒鐘的時間與你的給定清單。 – bdares 2011-05-13 08:06:24

回答

1

最好的解決方案是使用現有的搜索引擎,如Lucene或其替代方案之一(請參閱Which are the best alternatives to Lucene?)。

現在,如果你想自己實現它(這確實是一個很好的和現有的問題),你應該看看Inverted Index的概念。這就是谷歌和其他搜索引擎使用的。當然,他們有很多額外的系統,但這是最基本的。

倒排索引的思想是,對於每個關鍵字(和同義詞),存儲包含關鍵字的文檔的標識。因此,爲一組關鍵字查找匹配文檔非常容易,因爲您只需在倒排索引中計算其列表的交集(或聯合取決於您想要執行的操作)。例如:

讓我們假設你倒排索引:

smart: [42,35] 
gain: [42] 
profit: [55] 

現在,如果你有一個查詢「智能,獲得」,你的配套文件的交集(或聯合)[42,35]和[42]。

要處理同義詞,您只需要擴展查詢以包括初始查詢中單詞的所有同義詞。根據你的例子,你的查詢將變得「更快,更快,更有收益,更有利可圖」。

一旦你實現了,一個很好的改進是將TFIDF加權到你的關鍵字。這基本上是一種比常見詞(編程)更重的罕見詞(編程)的方法。

另一種方法是隻瀏覽所有文檔並找到包含您的單詞(或其同義詞)的文檔。倒排索引會更快,因爲您不必每次都瀏覽所有文檔。耗時的操作是建立索引,只需要完成一次。