繁体   English   中英

Lucene:MultiFieldQueryParser中的布尔值OR

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM