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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top