Search code examples
lucenepylucene

Lucene's MultiFieldQueryParser ignores setDefaultOperator


I'm trying to change the default operator for a MultiFieldQueryParser:

fields = [...]
query = "hello stackoverflow"
clauses = [BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD, ...]

parser = MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, analyzer)
parser.setDefaultOperator(QueryParserBase.AND_OPERATOR)
query = parser.parse(Version.LUCENE_CURRENT, query, fields, clauses, analyzer)

The resulting query is:

(FieldA:hello FieldA:stackoverflow) (FieldB:hello FieldB:stackoverflow)

How can I get an AND query to retrieve only these documents that contain BOTH words (hello AND stackoverflow) in one or more of the available fields (fieldA, fieldB)?

Thanks! - PyLucene 4.8.0, Python 2.7 64 bit


Solution

  • Those MultiFieldQueryParser.parse methods that take a bunch of arguments are all static. The query parser instance and anything you did to it might as well not be there at all, what you have is equivalent to:

    query = MultiFieldQueryParser.parse(Version.LUCENE_CURRENT, query, fields, clauses, analyzer)
    

    The parse you want, when using a instance of the query parser, is the one that just takes a string.

    fields = ["FieldA", "FieldB"]
    query = "hello stackoverflow"
    
    parser = MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, analyzer)
    parser.setDefaultOperator(QueryParserBase.AND_OPERATOR)
    query = parser.parse(query)