2009-12-30 71 views
11

我想在我的離線(android)應用程序中執行全文搜索來搜索用戶生成的筆記列表。像谷歌一樣的全文搜索

我想它表現得就像谷歌(因爲大多數人已經習慣查詢到谷歌)

我最初的要求是:

  • 快速:像谷歌或儘可能快,有100000個文件,每個200個字。
  • 搜索兩個單詞只應返回包含兩個單詞(不只是一個單詞)的文檔(除非使用OR運算符)
  • 不區分大小寫(又名:規範化):如果我有單詞「Hello」搜索它應該匹配的'hello'。
  • 變音符號不敏感:如果我有'así'這個詞,搜索'asi'應該匹配。在西班牙語中,很多人不正確地要麼不放置變音符號,要麼不能正確放置它們。
  • 停用詞的消除:爲了不會有像'和'這樣的巨大索引毫無意義的詞,''或'for'根本不應該被索引。
  • 字典替換(又名:詞幹):類似的詞應該被索引爲一個。例如,'飢餓'和'飢餓'的例子應該用'飢餓'代替。
  • 短語搜索:如果我有文字'Hello world!'搜索''world hello''不應該匹配它,而是應該匹配''hello world''的搜索。
  • 如果未指定字段(不僅僅是默認字段),則搜索所有字段(在多字段文檔中)
  • 在鍵入時自動完成搜索結果以提供熱門搜索。 (就像谷歌建議)

我該如何配置一個全文搜索引擎儘可能像谷歌一樣行事?

(我在開源的Java,特別是Lucene的最感興趣)

+1

如果你指向Lucene,它可以處理許多開箱即用且可擴展的問題,那麼你可以針對你遇到的問題具體說明一下嗎? – 2009-12-30 00:38:41

+0

你在找什麼? – SLaks 2009-12-30 00:39:15

+0

您確實意識到Google採用了http://en.wikipedia.org/wiki/Query_expansion並利用了其他人的搜索記錄。如果每個搜索「電腦鼠標」的人最終都會點擊yahoo.com(製作它),那麼隨着時間的推移,yahoo.com將成爲「電腦鼠標」的首個搜索結果。 – 2009-12-30 00:44:27

回答

14

我認爲Lucene可以滿足您的要求。您還應該考慮使用Solr,它具有相似的功能並且更易於設置。

我將分別討論每個需求,使用Lucene。我相信Solr有類似的機制。

  • 快速:像谷歌或儘可能快的,有100000頁的文件,每個200百個字。

這是既爲Lucene和Solr的一個合理的索引的大小,以數十每個查詢毫秒使檢索。

  • 搜索兩個詞應該只返回包含兩個詞(不只是一個字)的文件(除非OR運算符時)

你可以做到這一點使用BooleanQuery與在Lucene中默認爲MUST

  • 不區分大小寫(又名:標準化):

    接下來的四個要求,可以通過自定義一個Lucene Analyzer進行處理。如果我有字「你好」,我搜索「你好」它應該比賽。

LowerCaseFilter可以用於此目的。

  • 語音標記不敏感:如果我有一句話「ASI」的搜索「ASI」應該匹配。在西班牙語中,很多人不正確地要麼不放置變音符號,要麼不能正確放置它們。

這需要Unicode規範化,然後進行分隔符清除。您可以爲此構建自定義分析器。

  • 停用詞消除:要沒有像一個巨大的指數意義的話「和」,「的」或「對」不應該在所有的索引。

一個StopFilter消除在Lucene的停止詞。

  • 字典替換(又名:詞幹):類似的詞應該被索引爲一個。例如,'飢餓'和'飢餓'的例子應該用'飢餓'代替。

lucene有很多Snowball Stemmers。其中之一可能是適當的。

  • 短語搜索:如果我有文本「世界,你好!'搜索'世界你好''不應該匹配它,但''你好世界''的搜索應該匹配。

這是由Lucene的PhraseQuery專門的查詢覆蓋。

正如您所看到的,Lucene涵蓋了所有必需的功能。爲了獲得更全面的圖片,我建議書Lucene in Action,The Apache Lucene WikiThe Lucid Imagination Site

2

Google Search Appliance。或者,正如評論所說,使用Lucene就像你已經提到過的那樣。

+1

谷歌搜索設備不適合在離線Android應用程序中搜索數據。 – 2012-09-03 23:18:25

+2

我發佈我的答案後7小時添加了Android位。 3年後,搜索格局發生了巨大變化。 – 2012-09-04 17:51:59

3

很多這些行爲是Lucene默認的。第一次(包括所有方面)不是,但你可以通過設置默認的操作迫使這種行爲:

MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer()); 
parser.setDefaultOperator(QueryParser.AND_OPERATOR); 

我知道,項目2,4和6是可能的,並且IIRC,它們發生在默認情況下。我不確定項目3和5,但Lucene提供了大量的自定義選項,因此我建議對數據實施概念驗證,以確定它是否也符合這些要求。

0

除非你購買了搜索引擎,否則你有Lucene,Nutch,Apache Solr和其他一些搜索引擎。

0

HyperSQL是一個純Java的SQL實現,可以像SQLite一樣輕鬆地運行。您可以使用全文功能並查詢重新創建輪子,但正如其他評論者指出的,現有的實施可能是最好的。