大家好,我有一个问题:)
我像这样创建一个BooleanQuery:
BooleanQuery.Builder qry = new BooleanQuery.Builder();
qry.add(new TermQuery(new Term("Name", "Anna")), BooleanClause.Occur.SHOULD);
如果我现在这样搜索:
TopDocs docs = searcher.search(qry.build(), hitsPerPage);
结果为零?但是,如果我使用此代码:
TopDocs docs = searcher.search(parser.parse(qry.build().toString()), hitsPerPage);
那我得到正确的结果吗?您能解释一下为什么我必须再次解析吗?
我正在使用5.5.0版,并且Name是一个TextField
最佳答案
TextField
通过分析器运行数据,并且可能会产生术语"anna"
(小写)。 TermQuery
不会通过分析器运行任何内容,因此它会搜索"Anna"
(大写),这不匹配。用小写字母创建TermQuery
,您应该看到结果:new TermQuery(new Term("Name", "anna"))
。BooleanQuery
与此无关,实际上,此特定查询将自身重写为基础TermQuery
,因为这是唯一的子查询。
解析器采用字符串"Name:Anna"
(由TermQuery
生成),通过分析器运行它,并为您提供"Name:anna"
TermQuery
,这就是为什么通过解析器运行查询时它可以工作的原因–它涉及到必需的分析步骤。