Lucene术语查询

时间:2013-04-24 07:52:56

标签: lucene

在我的应用程序中,我们有交易,每笔交易都有一个目标用户组,可能包括性别,年龄和城市等几个字段。对于性别部分,交易的目标可以是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作为分析器。

2 个答案:

答案 0 :(得分:3)

可能有几种解决方案:

  
      
  1. 使用QueryParser构建查询,而不是使用TermQuery使用在索引时使用的相同分析器。例如在我的情况下,它将是:   查询查询=新的QueryParser(版本,“性别”,新的StandardAnalyzer())。解析(“MALE BOTH”);

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

  4.   
  5. (这个适用于StandardAnalyzer,对于其他分析器解决方案可能有所不同)在搜索之前,请对搜索字词进行小写。

  6.   

对情况的简要解释是:

我使用StandardAnalyzer来索引哪些小写输入令牌,以便可以实现不区分大小写的搜索。

然后我使用配置了相同分析器的QueryParser来构造用于在前端搜索用户查询的查询实例。搜索工作正常,因为按照标准分析器工作的解析器降低了用户的条件,并进行了区分大小写的搜索。

然后我需要过滤我编写TermQuery s而不是使用解析器的搜索结果,其中我使用了没有索引的大写文本,因此搜索失败。

答案 1 :(得分:2)

您的查询似乎完全有效,我会寻找其他可能错误的内容(例如,您是否在编制索引时没有LowerCaseFilter MALE/BOTH/FEMALE BooleanQuery条款?)。

您可能希望阅读有关如何将各种查询合并为一个{{1}}的{​​{3}}。