使用OR和不在solr查询

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

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

运行时,不会返回任何结果。 使用OR NOT两边的标准返回我期望的结果 – 他们只是不能很好地在一起工作。 在myField匹配superneat的情况下,我打算也确保myOtherField设置为somethingElse ,但是如果myField不是superneat ,请将其包含在结果中。

有人可以解释为什么solr不返回这种查询结果吗? 查询是否应该以某种方式进行重组 – 或者是否有一种不同的方法可以使用solr来达到预期的效果?

我不知道为什么这不起作用,但是这个在逻辑上是相当的,它确实起作用:

 -(myField:superneat AND -myOtherField:somethingElse) 

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

尝试在solr用户组中询问,然后在这里发回最终答案!

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

Solr目前检查一个“纯粹否定的”查询并插入*:* (它匹配所有文档),以便它能正常工作。

-foo被solr转换成(*:* -foo)

需要注意的是,Solr只检查顶级查询是否为纯粹的否定查询! 因此,这意味着像bar OR (-foo)这样的查询不会被改变,因为纯粹的否定查询是在顶级查询的子条款中。 你需要把这个查询自己转换成bar OR (*:* -foo)

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

 ?q=-title:foo&debug=query 

被转化为

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

综合来自两个不同的答案在这里,在Solr文档和其他SO问题的意见,我发现下面的语法产生正确的结果为我的用例

(my_field = my_value或my_field为空):

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

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

您可以在solr用户pipe理列表中findsolr用户组的跟进信息

普遍的看法是,NOT运算符只能用于从查询中删除结果 – 不仅仅是将整个数据集排除在外。 我碰巧喜欢你build议mausch的语法 – 谢谢!