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