MultiFieldQueryParser Lucene игнорирует setDefaultOperator

Я пытаюсь изменить оператор по умолчанию для 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)

Результирующий запрос:

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

Как я могу получить запрос AND для получения только тех документов, которые содержат ОБА слова (hello AND stackoverflow) в одном или нескольких доступных полях (fieldA, fieldB)?

Спасибо! - PyLucene 4.8.0, Python 2.7 64 бит


person Peter Clause    schedule 10.11.2014    source источник


Ответы (1)


Те MultiFieldQueryParser.parse методы, которые принимают множество аргументов, являются статическими. Экземпляр синтаксического анализатора запросов и все, что вы с ним сделали, может вообще отсутствовать, то, что у вас есть, эквивалентно:

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

parse, который вам нужен при использовании экземпляра анализатора запросов, это тот, который просто принимает строку.

fields = ["FieldA", "FieldB"]
query = "hello stackoverflow"

parser = MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, analyzer)
parser.setDefaultOperator(QueryParserBase.AND_OPERATOR)
query = parser.parse(query)
person femtoRgon    schedule 10.11.2014
comment
Привязка метода PyLucene, похоже, нарушена, я получил сообщение об ошибке, в котором говорится, что для разбора дескриптора требуется объект QueryParserBase, но я получил строку str. Когда я называю это как query = MultiFieldQueryParser.parse(parser, query), это работает как шарм. Спасибо! - person Peter Clause; 11.11.2014
comment
Метод getMultiFieldQuery в строке 284 MultiFieldQueryParser (версия lucene 8.1.1) выглядит подозрительно. Мне пришлось переключить BooleanClause.Occur с SHOULD на MUST, чтобы получить поведение AND. - person Ryan R.; 20.06.2019