简体   繁体   中英

Lucene: Boolean OR in MultiFieldQueryParser

I have a database with 10 fields, and I need to construct a query that looks something like the following pseudo code:

theQuery = ((field1 == A) && 
           (field2 == B) && 
           (field3 == C) && 
           (field4 == D) && 
           (field5 == E) && 
           (field6 == F) && 
           (field7 == G) && 
           ((field8 == H) || (field9 == H) || (field10 == H)))

That is to say that I need fields 1-7 to definitely contain the corresponding supplied variable, and I need the variable H to definitely appear in at least one of fields 8-10.

I have been trying to use the MultiFieldQueryParser, but the problem that I have is that the BooleanClauses supplied are MUST, MUST_NOT and SHOULD, and we can set the default operator of the MultiFieldQueryParser to be either AND or OR.

When I try using AND and setting fields 1-7 with MUST and fields 8-10 with SHOULD, the query parser basically ignores fields 8-10 and gives me back anything that contains the specified data in fields 1-7.

I haven't yet tried setting the default operator to OR, because I'm guessing that the query will return results that contain one or more of the supplied variables in fields 1-10.

For those that wish to see code, my code is as follows:

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);

Obviously this is somewhat simplified as the ArrayLists don't neatly return me arrays of Strings and BooleanClause.Occurs, but you get the idea.

Does anyone know of a way of forming a multifield query, including both boolean ANDs and boolean ORs?

Thanks, Rik

I don't really understand your notation, so it's hard to figure out what the problem is. But just use standard queries:

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

Or just do it in text and let the parser parse it for you: +field1:A +field2:B ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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