Lucene:MultiFieldQueryParser中的布尔值OR

时间:2012-01-11 11:02:44

标签: java search lucene

我有一个包含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字段时,查询解析器基本上忽略字段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不能整齐地返回我的Strings和BooleanClause.Occurs数组,但是你明白了。

有没有人知道形成多字段查询的方法,包括布尔AND 布尔OR?

谢谢, Rik

1 个答案:

答案 0 :(得分:0)

我真的不明白你的符号,所以很难弄清问题是什么。但只需使用标准查询:

 BooleanQuery topQuery = new BooleanQuery();
 topQuery.add(new TermQuery(...), BooleanClause.Occur.Must);
 etc.

或者只是在文本中执行它并让解析器为您解析它:+field1:A +field2:B ...