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

Я добавляю поддержку 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

Собственный QueryParser Lucene, кажется, оценивает "AND (NOT" в деревья объектов того же типа.

Это ошибка в Lucene или я неправильно понял оценку запроса Lucene? Я рад предоставить дополнительную информацию, если это необходимо.


person ponzao    schedule 18.03.2010    source источник


Ответы (1)


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

In

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

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

-title:"Jurassic Park"

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

person bajafresh4life    schedule 18.03.2010
comment
Большое спасибо, теперь это имеет смысл. - person ponzao; 18.03.2010
comment
Хорошо, .. Кажется, это имеет смысл. Но что, если (-title:Jurassic Park) вернул более 1 документа. Означает ли это, что если +year:1990 присутствует в этом документе, только этот документ будет предоставлен как найденный??..Похоже на это...Просто хочу понять немного больше. - person AngelsandDemons; 16.10.2013