我想在我的离线(android)应用程序中实现全文搜索,以搜索用户生成的笔记列表。
我希望它的行为与Google一样(因为大多数人已经习惯向谷歌查询)
我最初的要求是:
如何将全文搜索引擎配置为尽可能像Google一样?
(我最感兴趣的是开源,Java,特别是Lucene)
答案 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 Action,The Apache Lucene Wiki或The 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也是如此。你可以使用他们的全文功能和查询来重新创建轮子,但正如其他评论者指出的那样,现有的实现可能是最好的。