anidada evaluación de consultas con respecto a la negación de Lucene
-
20-09-2019 - |
Pregunta
Estoy añadiendo soporte Apache Lucene a Querydsl (que ofrece consultas de tipo de fallos para Java) y yo estoy teniendo problemas para entender cómo Lucene evalúa consultas especialmente con respecto a la negación en consultas anidadas.
Por ejemplo, las siguientes dos consultas en mi opinión son semánticamente lo mismo, pero sólo el primero devuelve resultados.
+year:1990 -title:"Jurassic Park"
+year:1990 +(-title:"Jurassic Park")
El árbol de objetos simplificado en el segundo ejemplo se muestra a continuación.
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
propia QueryParser
de Lucene parece evaluar "AND (NOT"
en el mismo tipo de árboles de objetos.
Es esto un error en Lucene o he entendido mal evaluación de la consulta de Lucene? Estoy feliz de dar más información si es necesario.
Solución
No son semánticamente el mismo.
En
+year:1990 +(-title:"Jurassic Park")
Tiene una subconsulta que sólo tiene una cláusula de NO. Lo que pasa es que Lucene está evaluando la
-title:"Jurassic Park"
cláusula y que está regresando 0 documentos. Entonces usted está indicando que debe ocurrir la subconsulta, y puesto que es devolver documentos cero, hace desaparecer el resto de la consulta.