Avaliação de consulta aninhada de Lucene sobre a negação
-
20-09-2019 - |
Pergunta
Estou adicionando Apache Lucene suporte para Querydsl (que oferece consultas seguras para o Java) e estou tendo problemas para entender como o Lucene avalia as consultas, especialmente em relação à negação em consultas aninhadas.
Por exemplo, as duas consultas a seguir, na minha opinião, são semanticamente as mesmas, mas apenas a primeira retorna os resultados.
+year:1990 -title:"Jurassic Park"
+year:1990 +(-title:"Jurassic Park")
A árvore de objeto simplificada no segundo exemplo é mostrada abaixo.
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
parece avaliar "AND (NOT"
no mesmo tipo de árvores de objetos.
Isso é um bug no Lucene ou eu não entendi a avaliação de consultas do Lucene? Fico feliz em fornecer mais informações, se necessário.
Solução
Eles não são semanticamente os mesmos.
Dentro
+year:1990 +(-title:"Jurassic Park")
Você tem uma subconeração que possui apenas uma cláusula não. O que está acontecendo é que Lucene está avaliando o
-title:"Jurassic Park"
Cláusula e está retornando 0 documentos. Então você está indicando que a subconsulta deve ocorrer e, como retorna zero documentos, nega o restante da consulta.