Google等全文搜索

Edu*_*rdo 12 java lucene full-text-search

我想在我的离线(android)应用程序中实现全文搜索,以搜索用户生成的笔记列表.

我希望它表现得像谷歌一样(因为大多数人已经习惯向谷歌查询)

我最初的要求是:

  • 快速:像Google或尽可能快,拥有100000个文档,每个文档200字.
  • 搜索两个单词应该只返回包含两个单词的文档(不只是一个单词)(除非使用OR运算符)
  • 不区分大小写(又名:规范化):如果我有'Hello'这个词并且我搜索'hello'它应该匹配.
  • 变音符号不敏感:如果我有'así'这个词,搜索'asi'应该匹配.在西班牙语中,许多人不正确地要么不提出变音标记,要么无法正确地放置它们.
  • 停止消除词:为了没有像'和'这样没有意义的无意义的词,''或'for'根本不应该被索引.
  • 字典替换(又名:词干):类似的词应该被索引为一个.例如,"饥饿"和"饥饿"的实例应该用"饥饿"代替.
  • 短语搜索:如果我有"Hello world!"文本 搜索''world hello''不应该匹配它,但搜索''hello world''应匹配.
  • 如果未指定字段(不仅仅是默认字段),则搜索所有字段(在多字段文档中)
  • 在键入时自动完成搜索结果以提供热门搜索.(就像Google Suggest一样)

我如何配置全文搜索引擎以尽可能多地表现为Google?

(我最感兴趣的是开源,Java,尤其是Lucene)

Yuv*_*l F 15

我认为Lucene可以满足您的要求.您还应该考虑使用Solr,它具有类似的功能并且更容易设置.

我将使用Lucene分别讨论每个要求.我相信Solr有类似的机制.

  • 快速:像Google或尽可能快,拥有100000个文档,每个文档200字.

对于Lucene和Solr来说,这是一个合理的索引大小,可以在每个查询的几十毫秒内进行检索.

  • 搜索两个单词应该只返回包含两个单词的文档(不只是一个单词)(除非使用OR运算符)

您可以使用在Lucene中默认为MUSTBooleanQuery来实现.

可以通过自定义Lucene Analyzer来处理接下来的四个要求:

  • 不区分大小写(又名:规范化):如果我有'Hello'这个词并且我搜索'hello'它应该匹配.

一个LowerCaseFilter可以用于此目的.

  • 变音符号不敏感:如果我有'así'这个词,搜索'asi'应该匹配.在西班牙语中,许多人不正确地要么不提出变音标记,要么无法正确地放置它们.

这需要Unicode标准化,然后删除变音符号.您可以为此构建自定义分析器.

  • 停止消除词:为了没有像'和'这样没有意义的无意义的词,''或'for'根本不应该被索引.

的StopFilter在Lucene中去除停止词.

  • 字典替换(又名:词干):类似的词应该被索引为一个.例如,"饥饿"和"饥饿"的实例应该用"饥饿"代替.

Lucene有许多Snowball Stemmers.其中一个可能是合适的.

  • 短语搜索:如果我有"Hello world!"文本 搜索''world hello''不应该匹配它,但搜索''hello world''应匹配.

这由Lucene PhraseQuery专用查询涵盖.

如您所见,Lucene涵盖了所有必需的功能.为了得到更全面的图片,我建议使用Lucene in Action,Apache Lucene WikiThe Lucid Imagination Site.