我正在为Apache 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中的错误还是我误解了Lucene的查询评估?如有必要,我很乐意提供更多信息。
答案 0 :(得分:3)
它们在语义上并不相同。
在
+year:1990 +(-title:"Jurassic Park")
您有一个只有一个NOT子句的子查询。发生的事情是Lucene正在评估
-title:"Jurassic Park"
子句,它返回0个文件。然后你指出子查询必须出现,并且由于它返回零文档,它否定了查询的其余部分。