我正在尝试使用以下要求查询Solr: _我想获得所有没有特定字段的文件
-exclusivity:[* TO *]
排他性:(无)
所以当我试图用:
查询Solr 4时fq =( - 排他性:[* TO *])或排他性:(无)
如果该字段存在于文档中且值为None但结果不包含第一次查询的结果,则我只得到结果!!
我无法理解为什么它不起作用
答案 0 :(得分:1)
为了解释您的结果,查询(-exclusivity:[* TO *])
将始终没有结果,因为您尚未指定任何要检索的结果。默认情况下,Lucene不会检索任何结果,除非您告诉它获取它们。 exclusivity:(None)
不是对完整结果集的限制,它是用于查找要检索的文档的键。这与数据库不同,数据库默认返回表中的所有记录,并允许您限制集。
(-exclusivity:[* TO *])
仅指定不能获得的内容,但不会告诉它任何内容。
Solr有处理纯负面查询的逻辑(我相信,与下面的方式大致相同,首先隐式检索所有文档),但是从我收集的内容来看,只作为顶级查询,并且它不处理查询例如term1 OR -term2
documented here。
我相信使用solr你应该能够使用查询*:*
来获取所有文档(虽然这在原始lucene中不可用),所以你可以使用查询:
(*:* -exclusivity:[* TO *]) exclusivity:(None)
这意味着,get(所有文档除了那些具有独占性值的文档)或docs exclusivity =“None”
答案 1 :(得分:0)
我已经找到了解决这个问题的方法。我已经做了一个错误的假设,“ - ”在solr.I虽然那个
-exclusivity:[* TO *]
将没有排他性字段的所有内容添加到数据集中,但事实并非如此。 ' - '只能从数据集中排除内容。 BTW femtoRgon你是对的,但我使用它作为fq(过滤器查询)而不是作为主查询我忘记提及。
所以解决方案就像
-exclusivity:([* TO *] AND - (None))
和完整查询看起来像
/?q = *:*& fq = -exclusivity:([* TO *] AND - (None))
这意味着我将获得所有内容没有字段排他性或具有此字段,并且填充值为None。