1

在我的应用程序中,我们有交易,每笔交易都有一个目标用户群,其中可能包括性别、年龄和城市等多个字段。对于性别部分,交易的目标可以是MALE FEMALEBOTH。我想找到针对男性或两者的交易。我创建了以下查询,但它不起作用......

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.1Standard Analyzer作为分析器。

4

2 回答 2

3

几种可能的解决方案是:

  1. 使用 aQueryParser来构造查询,而不是TermQuery使用在索引时使用的相同分析器。例如,在我的情况下,它将是:Query query = new QueryParser(version,"gender",new StandardAnalyzer()).parse("MALE BOTH ");

  2. 使用不同的分析器进行不区分大小写的索引。

  3. (这个适用于 StandardAnalyzer,对于其他分析仪的解决方案可能会有所不同)在搜索之前将您的搜索词小写。

解释

对这种情况的简要解释是:

我使用了一个StandardAnalyzer用于索引的小写输入标记,以便可以实现不区分大小写的搜索。

然后我使用QueryParser配置了相同的分析器来构造一个查询实例,用于在前端搜索用户的查询。搜索有效,因为按照标准分析器工作的解析器将用户的术语小写并进行区分大小写的搜索。

然后我需要过滤我写了TermQuerys 而不是使用解析器的搜索结果,在解析器中我使用了没有以这种方式索引的大写文本,因此搜索失败。

于 2013-04-26T08:55:57.313 回答
2

您的查询似乎完全有效,我会寻找其他可能有问题的东西(例如,您在索引时没有偶然使用LowerCaseFilterfor术语吗?)。MALE/BOTH/FEMALE

您可能想阅读这篇文章,了解如何将各种查询组合成一个BooleanQuery.

于 2013-04-24T08:35:12.867 回答