Оценка вложенного запроса Lucene относительно отрицания

StackOverflow https://stackoverflow.com/questions/2469128

Вопрос

Я добавляю Апач Лусене поддержка 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 документов.Затем вы указываете, что подзапрос ДОЛЖЕН произойти, и, поскольку он возвращает ноль документов, он аннулирует остальную часть запроса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top