Оценка вложенного запроса Lucene относительно отрицания
-
20-09-2019 - |
Вопрос
Я добавляю Апач Лусене поддержка Querydsl (который предлагает типобезопасные запросы для Java), и у меня возникли проблемы с пониманием того, как Lucene оценивает запросы, особенно в отношении отрицания во вложенных запросах.
Например, следующие два запроса, на мой взгляд, семантически одинаковы, но только первый возвращает результаты.
+year:1990 -title:"Jurassic Park"
+year:1990 +(-title:"Jurassic Park")
Упрощенное дерево объектов во втором примере показано ниже.
query : Query
clauses : ArrayList
[0] : BooleanClause
"MUST" occur : BooleanClause.Occur
"year:1990" query : TermQuery
[1] : BooleanClause
"MUST" occur : BooleanClause.Occur
query : BooleanQuery
clauses : ArrayList
[0] : BooleanClause
"MUST_NOT" occur : BooleanClause.Occur
"title:"Jurassic Park"" query : TermQuery
Собственный Lucene QueryParser
кажется, оценивает "AND (NOT"
в такие же деревья объектов.
Это ошибка в Lucene или я неправильно понял оценку запроса Lucene?Я буду рад предоставить дополнительную информацию, если это необходимо.
Решение
Они не являются семантически одинаковыми.
В
+year:1990 +(-title:"Jurassic Park")
У вас есть подзапрос, содержащий только одно предложение NOT.Происходит то, что Lucene оценивает
-title:"Jurassic Park"
пункт и возвращает 0 документов.Затем вы указываете, что подзапрос ДОЛЖЕН произойти, и, поскольку он возвращает ноль документов, он аннулирует остальную часть запроса.