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