Lucene的嵌套查询评估关于否定
-
20-09-2019 - |
题
我加入阿帕奇Lucene的以支持 Querydsl (提供类型安全的查询的Java)和我时遇到理解的Lucene如何评估特别是关于在嵌套查询的否定的查询的问题。
例如,在我的意见以下两个查询在语义上是相同的,但是只有第一个返回结果。
+year:1990 -title:"Jurassic Park"
+year:1990 +(-title:"Jurassic Park")
在第二实施例中的简化的对象树如下所示。
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
似乎评估"AND (NOT"
到同一类型的对象树。
这是在Lucene的BUG或者有我误解了Lucene的查询评估?我很高兴,如果有必要提供更多的信息。
解决方案
它们不是语义上是相同的。
在
+year:1990 +(-title:"Jurassic Park")
您有一个子查询只有一个NOT子句。发生了什么事是,Lucene是评估
-title:"Jurassic Park"
子句和它的返回0的文件。然后,就表示必须发生的子查询,并且因为它是返回零个文件,它否定了查询的其余部分。
不隶属于 StackOverflow