使用布尔运算符的奇怪Solr / Lucene行为

时间:2011-09-09 15:15:51

标签: lucene solr

我在使用Solr / Lucene查询语法中的 - 运算符时遇到了奇怪的行为。 如果我执行查询

-text AND -text 

我得到了所有预期的结果(很多),但如果我加上一些括号,如

-text AND (-text) 

(-text) AND (-text) 

然后我根本没有结果。我不明白为什么。 你对这种行为有解释吗?

提前谢谢。

2 个答案:

答案 0 :(得分:11)

这个问题得到了很好的回答 Solr mailing list。他们还在官方常见问题解答中添加了一个条目:

  

布尔查询必须至少有一个“正”表达式(即; MUST或SHOULD)才能匹配。 Solr尝试帮助解决这个问题,如果要求执行一个只包含最高级别的负面子句的BooleanQuery,它会添加一个匹配所有文档查询(即:*:*)

     

如果顶级BoolenQuery包含一个嵌套的BooleanQuery,其中只包含negated子句,那嵌套查询将不会被修改,并且(根据定义)它不匹配任何文档 - 如果需要,那么表示外部查询不匹配。

因此只有“负”值的表达式总是返回0结果,除了最顶层,解析器在查询开头静默添加*:*

因此,-text AND -text会转换为*:* -text AND -text,因此会产生结果 (-text)未转换为(*:* -text),因为它不在最高级别,因此(-text)没有结果。

答案 1 :(得分:1)

说明取决于您使用的搜索处理程序和整个查询字符串。

例如:您可以搜索多个字段,例如

text AND text< - 在所有(默认)字段中搜索 - 取决于搜索处理程序

FIELD1:text AND text< - 使用AND在FIELD1内搜索

FIELD1:text1 AND (-text2)< - 对FIELD1中的text1进行搜索(我记得没错),而不是所有其他(默认)文档中的text2 - 具体取决于搜索处理程序。

我认为,使用()会更改搜索范围/字段。

也许你描述的行为与这样的行为有关?!