Question

J'ajoute Apache Lucene soutien à Querydsl (qui offre des requêtes de type sécurisé pour Java) et je rencontre des problèmes de comprendre comment Lucene évalue les requêtes en particulier en ce qui concerne la négation dans les requêtes imbriquées.

Par exemple, les deux requêtes suivantes à mon avis sont sémantiquement les mêmes, mais seul le premier renvoie les résultats.

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

L'arbre d'objet simplifié dans le second exemple est illustré ci-dessous.

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

propre QueryParser Lucene semble évaluer "AND (NOT" dans le même genre d'arbres objet.

Est-ce un bogue dans Lucene ou ai-je mal compris l'évaluation de la requête de Lucene? Je suis heureux de donner plus d'informations si nécessaire.

Était-ce utile?

La solution

Ils ne sont pas sémantiquement les mêmes.

Dans

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

Vous avez un sous-requête qui n'a qu'une seule clause NOT. Ce qui se passe est que Lucene évalue le

-title:"Jurassic Park"

clause et il est de retour 0 documents. Ensuite, vous indiquant que la sous-requête doit se produire, et comme il est de retour zéro documents, il annule le reste de la requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top