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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top