[英]Lucene: Boolean OR in MultiFieldQueryParser
我有一个包含10个字段的数据库,我需要构造一个看起来类似于以下伪代码的查询:
theQuery = ((field1 == A) &&
(field2 == B) &&
(field3 == C) &&
(field4 == D) &&
(field5 == E) &&
(field6 == F) &&
(field7 == G) &&
((field8 == H) || (field9 == H) || (field10 == H)))
也就是说,我需要字段1-7明确包含相应提供的变量, 并且我需要变量H 明确出现在字段8-10中的至少一个中。
我一直在尝试使用MultiFieldQueryParser,但是我遇到的问题是所提供的BooleanClauses必须为MUST,MUST_NOT和SHOULD,并且我们可以将MultiFieldQueryParser的默认运算符设置为AND或OR。
当我尝试使用AND并将字段1-7设置为MUST,将字段8-10设置为SHOULD时,查询解析器基本上会忽略字段8-10,并为我提供包含字段1-7中指定数据的任何内容。
我尚未尝试将默认运算符设置为OR,因为我猜测查询将返回包含字段1-10中提供的一个或多个变量的结果。
对于那些希望查看代码的人,我的代码如下:
ArrayList queries = new ArrayList();
ArrayList fields = new ArrayList();
ArrayList flags = new ArrayList();
if(varA != null && !varA.equals(""))
{
queries.Add(varA);
fields.Add("field1");
flags.Add(BooleanClause.Occur.Must);
}
//... The same for 2-7
if(varH != null && !varH.equals(""))
{
queries.Add(varA);
queries.Add(varA);
queries.Add(varA);
fields.Add("field8");
fields.Add("field9");
fields.Add("field10");
flags.Add(BooleanClause.Occur.Should);
flags.Add(BooleanClause.Occur.Should);
flags.Add(BooleanClause.Occur.Should);
}
Query q = MultiFieldQueryParser.parse(VERSION.LUCENE_34,
queries.toArray(),
fields.toArray(),
flags.toArray(),
theAnalyzer);
显然,这有所简化,因为ArrayLists不能整齐地返回String和BooleanClause数组给我,但是您明白了。
有谁知道一种形成多字段查询的方法,包括布尔AND 和布尔OR?
谢谢,瑞克
我不太了解您的用法,因此很难弄清问题所在。 但是,只需使用标准查询:
BooleanQuery topQuery = new BooleanQuery();
topQuery.add(new TermQuery(...), BooleanClause.Occur.Must);
etc.
或者只是以文本形式执行,然后让解析器为您解析: +field1:A +field2:B ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.