Оценка вложенных запросов Lucene относительно отрицания - PullRequest
1 голос
/ 18 марта 2010

Я добавляю Apache Lucene поддержку к 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? Я рад предоставить больше информации, если это необходимо.

1 Ответ

3 голосов
/ 18 марта 2010

Они семантически не одинаковы.

В

+year:1990 +(-title:"Jurassic Park")

У вас есть подзапрос, в котором есть только одно предложение NOT. Происходит то, что Lucene оценивает

-title:"Jurassic Park"

и возвращается 0 документов. Затем вы указываете, что подзапрос ДОЛЖЕН выполняться, и, поскольку он возвращает ноль документов, он отменяет остальную часть запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...