在solr查询中使用OR和NOT

时间:2009-03-11 14:34:32

标签: search lucene solr

我正在处理类似于以下内容的solr查询:

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

运行此操作时,不会返回任何结果。使用OR NOT任一侧的标准会返回我期望的结果 - 它们只是不能很好地协同工作。如果 myField superneat 匹配,我还打算确保 myOtherField 设置为 somethingElse ,但如果 myField 不是 superneat ,请将其包含在结果中。

有人可以解释为什么solr没有返回此类查询的结果吗?查询是否应该以某种方式重组 - 或者是否有不同的方法可以使用solr来实现所需的结果?

7 个答案:

答案 0 :(得分:81)

我不知道为什么这不起作用,但这个在逻辑上是等价的,确实有效:

-(myField:superneat AND -myOtherField:somethingElse)

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

尝试在solr-user group中询问,然后在这里回复最终答案!

答案 1 :(得分:39)

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

答案 2 :(得分:32)

Solr目前检查“纯阴性”查询并插入*:*(与所有文档匹配)以使其正常工作。

-foo由solr转换为(*:* -foo)

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

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

?q=-title:foo&debug=query

转换为

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

答案 3 :(得分:23)

在这里,在Solr文档和另一个SO问题中汇总来自几个不同答案的评论,我发现以下语法为我的用例生成了正确的结果

(my_field = my_value或my_field为null):

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

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

答案 4 :(得分:8)

您可以在solr user mailling list

上找到solr-user组的跟进

普遍认为NOT运算符只能用于从查询中删除结果 - 而不仅仅是从整个数据集中排除内容。我碰巧喜欢你建议mausch的语法 - 谢谢!

答案 5 :(得分: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中

答案 6 :(得分:0)

简单做 id :(“ 12345”)或id :(“ 7890”)....依此类推