在我的应用程序中,我们有交易,每笔交易都有一个目标用户组,可能包括性别,年龄和城市等几个字段。对于性别部分,交易的目标可以是MALE
FEMALE
或BOTH
。我想找到男性或两者的交易。我创建了以下查询,但它不起作用......
TermQuery maleQuery = new TermQuery(new Term("gender","MALE"));
TermQuery bothQuery = new TermQuery(new Term("gender","BOTH"));
BooleanQuery query = new BooleanQuery();
query.add(maleQuery,BooleanClause.Occur.SHOULD);
query.add(bothQuery,BooleanClause.Occur.SHOULD);
请告知我是否犯了一些错误。不知何故,它似乎仅吐出MALE
个交易,而不是BOTH
。
我使用版本4.2.1
和Standard Analyzer
作为分析器。
答案 0 :(得分:3)
可能有几种解决方案:
使用
QueryParser
构建查询,而不是使用TermQuery
使用在索引时使用的相同分析器。例如在我的情况下,它将是: 查询查询=新的QueryParser(版本,“性别”,新的StandardAnalyzer())。解析(“MALE BOTH”);使用不同的分析器进行不区分大小写索引的索引。
- 醇>
(这个适用于StandardAnalyzer,对于其他分析器解决方案可能有所不同)在搜索之前,请对搜索字词进行小写。
对情况的简要解释是:
我使用StandardAnalyzer
来索引哪些小写输入令牌,以便可以实现不区分大小写的搜索。
然后我使用配置了相同分析器的QueryParser
来构造用于在前端搜索用户查询的查询实例。搜索工作正常,因为按照标准分析器工作的解析器降低了用户的条件,并进行了区分大小写的搜索。
然后我需要过滤我编写TermQuery
s而不是使用解析器的搜索结果,其中我使用了没有索引的大写文本,因此搜索失败。
答案 1 :(得分:2)
您的查询似乎完全有效,我会寻找其他可能错误的内容(例如,您是否在编制索引时没有LowerCaseFilter
MALE/BOTH/FEMALE
BooleanQuery
条款?)。
您可能希望阅读有关如何将各种查询合并为一个{{1}}的{{3}}。