Google等全文搜索

时间:2009-12-30 00:35:33

标签: java full-text-search lucene

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

我希望它的行为与Google一样(因为大多数人已经习惯向谷歌查询)

我最初的要求是:

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

如何将全文搜索引擎配置为尽可能像Google一样?

(我最感兴趣的是开源,Java,特别是Lucene)

5 个答案:

答案 0 :(得分:15)

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

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

  
      
  • 快速:像谷歌一样或尽可能快,拥有100000个文件,每个文件200字。
  •   

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

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

您可以使用BooleanQuery并使用MUST作为Lucene的默认设置。

可以通过自定义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 ActionThe Apache Lucene WikiThe Lucid Imagination Site

答案 1 :(得分:3)

很多这些行为都是Lucene的默认行为。第一个(包括所有术语)不是,但您可以通过设置默认运算符来强制执行此操作:

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

我知道第2,第4和第6项是可能的,而IIRC,它们是默认发生的。我不确定第3项和第5项,但Lucene提供了大量的自定义选项,因此我建议在您的数据中实施概念验证,以确定它是否也符合这些要求。

答案 2 :(得分:2)

购买Google Search Appliance。或者,正如评论所说,使用您已经提到过的Lucene

答案 3 :(得分:0)

除非您购买搜索引擎,否则您拥有Lucene,Nutch,Apache Solr以及其他一些搜索引擎。

答案 4 :(得分:0)

HyperSQL是一种纯Java SQL实现,可以很容易地运行,SQLite也是如此。你可以使用他们的全文功能和查询来重新创建轮子,但正如其他评论者指出的那样,现有的实现可能是最好的。