我在使用Solr / Lucene查询语法中的 - 运算符时遇到了奇怪的行为。 如果我执行查询
-text AND -text
我得到了所有预期的结果(很多),但如果我加上一些括号,如
-text AND (-text)
或
(-text) AND (-text)
然后我根本没有结果。我不明白为什么。 你对这种行为有解释吗?
提前谢谢。
答案 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 - 具体取决于搜索处理程序。
我认为,使用()
会更改搜索范围/字段。
也许你描述的行为与这样的行为有关?!