Domanda

Io sono l'aggiunta di supporto Apache Lucene per Querydsl (che offre query type-safe per Java) ed io sto avendo difficoltà a capire come Lucene valuta query soprattutto per quanto riguarda negazione nelle query nidificate.

Per esempio i seguenti due query a mio parere sono semanticamente lo stesso, ma solo il primo restituisce risultati.

+year:1990 -title:"Jurassic Park"
+year:1990 +(-title:"Jurassic Park")

L'albero oggetto semplificata nel secondo esempio è mostrato sotto.

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

proprio QueryParser di Lucene sembra di valutare "AND (NOT" nello stesso tipo di alberi di oggetti.

Si tratta di un bug in Lucene o ho frainteso la valutazione di query di Lucene? Sono felice di dare più informazioni, se necessario.

È stato utile?

Soluzione

Non sono semanticamente lo stesso.

+year:1990 +(-title:"Jurassic Park")

Si dispone di un subquery che ha un solo NON clausola. Quello che sta succedendo è che Lucene sta valutando l'

-title:"Jurassic Park"

clausola ed è il ritorno 0 documenti. Poi si sta ad indicare che deve avvenire la subquery, e dal momento che è tornare a zero i documenti, si nega il resto della query.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top