2

大家好,我有一个问题:)

我像这样创建一个 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 版,名称是 TextField

4

1 回答 1

4

ATextField通过分析器运行您的数据,并且可能会产生术语"anna"(小写)。ATermQuery不通过分析器运行任何东西,因此它搜索"Anna"(大写)并且这不匹配。TermQuery使用小写术语创建,您应该会看到结果: new TermQuery(new Term("Name", "anna")). 与此BooleanQuery无关,实际上,此特定查询会将自身重写为底层TermQuery,因为这是唯一的子查询。解析器获取字符串"Name:Anna"(由 生成TermQuery),通过分析器运行它并给你一个"Name:anna" TermQuery,这就是如果你通过解析器运行查询它可以工作的原因 - 它涉及必要的分析步骤。

于 2016-03-08T13:11:51.967 回答