2016-03-08 65 views
1

你好,大家好我有一个问题:)Lucene的BooleanQuery.Builder构建不起作用

我创建了一个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

回答

3

一个TextField通过分析运行数据,并可能会产生术语"anna"(小写)。 A TermQuery不通过分析器运行任何操作,因此它搜索"Anna"(大写),并且这不匹配。使用小写字母创建TermQuery,您应该看到结果:new TermQuery(new Term("Name", "anna"))BooleanQuery与此无关,事实上,这个特定的查询会将自身重写为底层的TermQuery,因为这是唯一的子查询。 解析器采用字符串"Name:Anna"(由TermQuery生成),通过分析器运行它,并为您提供一个"Name:anna"TermQuery,这就是为什么它在您通过解析器运行查询时有效 - 它涉及必要的分析步骤。

+0

啊好吧谢谢非常多:)我在哪里可以设置忽略大小写? – Montezuma

+1

Lucene并没有真正以这种方式工作,您可以在某处设置忽略大小写。这一切都取决于你的分析仪。大多数分析器都包含一个小写标记过滤器,它将小写所有内容。您必须确保您的查询通过兼容的分析器(理想情况下是同一个分析器)运行,以便生成匹配的令牌。 TermQuery不使用任何分析器,因此您必须事先执行该步骤,例如通过使用查询解析器,它通过分析器运行的东西(实际上没有首先构建布尔查询)。 – knutwalker