在solr查询中使用OR和NOT


83

我正在研究类似于以下内容的Solr查询:

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

运行此命令时,不会返回任何结果。在“或非”两边使用条件会返回我期望的结果-它们不能很好地协同工作。在myField匹配superneat的情况下,我还打算确保将myOtherField设置为somethingElse,但是如果myField不是superneat,请将其包括在结果中。

有人可以解释为什么solr不返回这种查询的结果吗?应该以某种方式重组查询吗?或者有其他方法可以使用solr获得所需的结果吗?

Answers:


82

我不知道为什么这行不通,但是从逻辑上讲这是等效的,并且确实行得通:

-(myField:superneat AND -myOtherField:somethingElse)

也许与查询中两次定义相同的字段有关...

尝试在solr-user组中询问,然后在此处发布最终答案!


谢谢您的帮助!这确实有效-我已将其提交给solr-user组。我会在这里发布任何有用的信息。
stolenricecakes,2009年

8
请注意,-myField:superneat OR myOtherField:somethingElse这也将是相同的,并且稍微简单一些。
Yorick Sijsling

3
@YorickSijsling的要点是,即使在逻辑上是等效的,Solr有时也无法很好地应对纯粹的否定查询,例如OP发布的查询或您发布的查询。
Mauricio Scheffer

@Mauricio Scheffer-我会完全质疑。您能否解释一下它的效果如何?我们在这里运行相当复杂的条件,发现它可以很好地处理数十亿个文档。
terrance.a.snyder 2012年

@ terrance.a.snyder“复杂条件”!=“完全否定查询”。另外,在最新版本的Solr中,情况可能有所改善,我没有检查。
Mauricio Scheffer

42
Instead of "NOT [condition]" use "(*:* NOT [condition])"

1
非常感谢!即使对于复杂的查询,这也对我有用,而-(myField:superneat AND -myOtherField:somethingElse)方法却没有!
dpetruha

33

Solr当前检查“纯否定”查询并插入*:*(与所有文档匹配)以便正确运行。

-foo 通过solr转化为 (*:* -foo)

最大的警告是,Solr仅检查顶级查询是否为纯否定查询!因此,这意味着类似的查询bar OR (-foo)不会更改,因为纯否定查询位于顶级查询的子条款中。您需要自己将此查询转换为bar OR (*:* -foo)

您可以检查solr查询说明以验证查询转换:

?q=-title:foo&debug=query

转化为

(+(-title:foo +MatchAllDocsQuery(*:*))

1
edismax可以正确处理嵌套的纯否定查询,对吗?是否有关于修补Lucene查询解析器以相同方式支持它们的讨论?
彼得·迪克森·摩西

24

在Solr文档和其他SO问题中,将来自几个不同答案的注释放在一起,我发现以下语法为我的用例生成了正确的结果

(my_field = my_value或my_field为空):

(my_field:"my_value" OR (*:* NOT my_field:*))

这适用于solr 4.1.0。这与OP中的用例略有不同;但是,我认为其他人会发现它很有用。


1
今天在Solr 5中完全了解这种情况,此建议有效。
Ryan Shelley

9

您可以在以下位置找到solr-user组的后续操作: solr用户邮件列表

普遍的想法是,NOT运算符只能用于从查询中删除结果,而不仅仅是从整个数据集中排除事物。我碰巧喜欢您建议的粗略语法-谢谢!


3

只是增加了另一个意外的情况,这是未返回预期结果的查询:

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_b就我而言,这是我执行的方面,需要针对该类型(栏)定位查询字词“ foo”

我必须在或条件之后插入另一个 *:*,以使其正常工作,如下所示:

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

编辑:这是在solr 6.6.3


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.