我是Lucene的新手并尝试使用Query
将原始字符串解析为QueryParser
。
我在想,为什么QueryParser.Parse()
方法需要一个Analyzer参数?
如果分析与查询有关,那么在处理常规Analyzer
对象时也应指定Query
(TermQuery
,BooleanQuery
等) ,如果没有,为什么QueryParser
需要它?
答案 0 :(得分:10)
当索引时,Lucene将文本划分为原子单位(标记)。在此阶段,可能会发生许多事情(例如,小写,词干,删除停用词等)。最终结果是一个术语。
然后,当您查询时,Lucene将完全相同的算法应用于查询,以便它可以将术语与术语匹配。
问:为什么TermQuery
不需要分析仪?
答:QueryParser
对象解析查询字符串并生成TermQuery
(也可以生成其他类型的查询,例如PhraseQuery
)。 TermQuery
已包含与索引中形状相同的字词。如果您(作为程序员)完全确定您在做什么,您可以自己创建TermQuery
- 但这假设您知道查询解析的确切顺序,并且您知道索引中的术语如何。
问:为什么BooleanQuery
不需要分析仪?
答:BooleanQuery
只是使用运算符(AND / OR / MUST / SHOULD等)加入其他查询。没有任何其他问题,它本身并没有用。
这是一个非常简化的答案。我强烈建议您阅读Introduction to Information Retrieval本书;它包含了基于Lucene(和其他类似框架)编写的理论。这本书可以在线免费获得。