【发布时间】:2011-11-13 21:31:25
【问题描述】:
我在 Solr/Lucene 查询语法中使用 - 运算符时遇到了一种奇怪的行为。 如果我执行查询
-text AND -text
我得到了所有预期的结果(很多),但是如果我加上一些括号,比如
-text AND (-text)
或
(-text) AND (-text)
然后我根本没有得到任何结果。我不明白为什么。 你对这种行为有解释吗?
提前谢谢你。
【问题讨论】:
我在 Solr/Lucene 查询语法中使用 - 运算符时遇到了一种奇怪的行为。 如果我执行查询
-text AND -text
我得到了所有预期的结果(很多),但是如果我加上一些括号,比如
-text AND (-text)
或
(-text) AND (-text)
然后我根本没有得到任何结果。我不明白为什么。 你对这种行为有解释吗?
提前谢谢你。
【问题讨论】:
这个问题已经得到很好的回答 Solr mailing list。他们还在官方常见问题解答中添加了一个条目,上面写着:
布尔查询必须至少有一个“肯定”表达式(即,必须或应该)才能匹配。 Solr 试图帮助解决这个问题,如果被要求执行仅包含否定子句的 BooleanQuery 在最顶层,它会添加匹配所有文档查询(即:*:*)
如果顶级 BoolenQuery 在其内部某处包含一个仅包含否定子句的嵌套 BooleanQuery,则该嵌套查询将不会被修改,并且它(根据定义)不匹配任何文档 - 如果需要,那表示外部查询将不匹配。
所以只有“负”值的表达式总是返回 0 结果,除了最顶层,解析器在查询的开头默默地添加一个*:*。
因此,-text AND -text 被转换为 *:* -text AND -text,所以它有结果,而
(-text) 没有转换为 (*:* -text),因为它不在最顶层,所以 (-text) 没有给出任何结果。
【讨论】:
解释取决于您使用的搜索处理程序和整个查询字符串。
例如:您可以搜索多个字段,例如
text AND text
FIELD1:text AND text AND 在 FIELD1 中搜索
FIELD1:text1 AND (-text2)
我认为,使用 () 会改变搜索的范围/字段。
也许你描述的行为与这样的事情有关?!
【讨论】: