2010-03-18 6 views
1

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

ответ

3

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

В

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

У вас есть подзапрос, который имеет одну только НЕ положение. Что происходит, так это то, что Lucene оценивает

-title:"Jurassic Park" 

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

+0

Спасибо за кучу, теперь это имеет смысл. – ponzao

+0

Как делать НЕ ТОЛЬКО поиск, если вам действительно нужно ... –

+0

Хорошо, это кажется разумным. Но что, если (-title: «Jurassic Park») вернул более 1 документа. Это означает, что если в этом документе присутствует только год: 1990, только этот документ будет предоставлен как попадание? .. Похоже на это .. Просто хочу понять немного больше. – AngelsandDemons