2012-03-21 155 views
3

我正在構建一個自動完成功能,它必須快速查詢超過1000萬個單詞/短語,並遇到一些問題。我的第一個想法是通過某種trie /三元樹結構,但這些都是嚴格的前綴匹配,這是不夠我的應用程序(我想完整的中綴匹配)。然後,我轉向了一些更大的解決方案,SqlServer全文索引,Lucene,Solr,Sphinx,但Lucene和SqlServer FullText索引實際上並不是全文,而是帶有漂亮功能(soundex,proximity等)的前綴。我試圖想到Levenshtein編輯距離可以提供幫助的一種方法,但是找不到一種方法既能夠達到相當準確的效果,又能支持具有較高編輯距離的單詞(例如,Google和ogl,編輯距離爲3,但3是高門檻的一般情況)。快速搜索中文

我的問題是,Google/bing等強大的機構如何做到這一點?他們只是在一段時間後蠻橫嗎?我會想象不到,但我找不到任何支持。

任何幫助,將不勝感激!

+1

我猜N-gram方法可能有幫助。然後是http://sna-projects.com/cleo/,它可以滿足您的需求。 – aitchnyu 2012-03-21 06:59:23

+1

「Lucene不是全文」?你能詳細說明一下嗎?看起來你有一個不同於大多數人使用的定義。另外,你對Solr/Lucene/Sphinx/etc的每一個嘗試過什麼?你知道Solr有一個特定的組件來處理自動完成嗎? – 2012-03-21 12:18:48

+0

我全文意思是如果我搜索「* talli *」,「metallica」是匹配的。在sqlserver和lucene下,情況並非如此。 – hermitt 2012-03-21 18:11:22

回答

0

如果您在Lucene的啓用queryParser.setAllowLeadingWildcard(true);,你可以使用前端和後端通配符,如:

*talli* 

這將拿起含有「talli」包括「Metallica的」所有單個詞術語。

對於您來說,這可能不夠快,但是在某些情況下(如果您可以預先處理查詢字符串,您可能會得到舊字符),但在某些情況下(僅用於前綴通配符搜索)那也「訣竅:

acillateM 
0

Lucene/Solr可以很容易地做到這一點。 Lucene/Solr中的搜索單元是一個Term,它通常是一個單詞,但根據text analysis的配置方式,幾乎可以做任何事情。

使用Solr有很多方法來實現這個(ngrams/shingles,facet前綴,TermsComponent,...)。 Solr的最新版本附帶autocomplete based on spell checking的特定組件。

0

當我在2013年需要中綴搜索時,我做了一些研究。我發現的唯一方法是Sphinx engine。需要將其配置爲支持中綴搜索

index tra 
{ 
    [...] 
    enable_star=1 
    min_infix_len=2 
} 

之後它處理眨眼問題。我認爲這是大約20萬條記錄進行搜索。我使用本地引擎模仿內存中的搜索庫。