使用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的语法 – 谢谢!