在分组中将AND,OR与NOT组合

时间:2013-05-28 06:36:23

标签: search lucene parentheses query-parser booleanquery

  

测试:1而不是bool:true

返回5个文件

但是

  

测试:1 AND(不是bool:true)

返回0个文件

为什么?

请解释lucene查询形成中括号的值

1 个答案:

答案 0 :(得分:1)

当您在括号中放置(NOT bool:true)时,它将成为子查询,该查询独立于查询test:1执行。 Lucene中的NOT子句仅从结果集中删除元素,它们找不到任何内容。例如,在SQL中,您隐式地从每个可用值开始,并过滤掉与子句不匹配的元素。在Lucene中,您从零开始,并根据子句查找结果。查询NOT bool:true告诉它什么不匹配,但不给Lucene任何东西来查找和返回。任何形式的查询:

(any query finding results) AND (NOT something)

会找到零结果,因为,就它本身而言,NOT something什么都找不到,而(something) AND (nothing)什么都不返回。您可以通过在孤独的NOT子句之前获取所有值来执行类似的搜索,例如:

test:1 AND (*:* AND NOT bool:true)

然而,这将表现得非常糟糕,这是你的第一个例子:

test:1 AND NOT bool:true

绝对是正确的。