évaluation des requêtes imbriquées de Lucene en ce qui concerne la négation
-
20-09-2019 - |
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.
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.