2013-03-05 74 views
6

我是Lucene的新手,并尝试使用QueryParser解析原始字符串到Query为什么Lucene QueryParser需要分析器

我在想,为什么QueryParser.Parse()方法需要分析器参数?

如果某种与查询做,那么Analyzer应定期Query对象处理,以及时指定分析(TermQueryBooleanQuery等),如果没有,为什么QueryParser需要它?

回答

10

索引时,Lucene将文本划分为原子单位(标记)。在这个阶段中可能会发生许多事情(例如,降级,干扰,停用词的删除等)。最终结果是一个术语。

然后,当您查询时,Lucene将完全相同的算法应用于查询,以便它可以将术语与术语匹配。

问:为什么TermQuery需要分析仪?
答:QueryParser对象解析查询字符串并生成TermQuery(也可以生成其他类型的查询,例如PhraseQuery)。 TermQuery已经包含与它们在索引中相同形状的术语。如果你(作为程序员)完全确定你在做什么,你可以自己创建一个TermQuery - 但是这假设你知道查询解析的确切顺序,并且你知道在索引中条目的样子。

问:为什么BooleanQuery需要分析仪?
答:BooleanQuery只是使用运算符(AND/OR/MUST/SHOULD等)加入其他查询。没有任何其他疑问,它本身并不是很有用。

这是一个简化的答案。我强烈推荐阅读Introduction to Information Retrieval书;它包含基于Lucene(和其他类似框架)编写的理论。本书免费在线提供。

+0

谢谢,但它不能解释为什么指定分析器只需要解析查询字符串,而不是查询时。 – haim770 2013-03-05 14:40:02

+0

编辑我的答案,让我知道如果它不够清楚或错过任何东西。 – mindas 2013-03-05 14:48:07