【发布时间】:2013-01-25 04:02:01
【问题描述】:
我正在尝试使用以下要求查询 Solr: _ 我想获取所有没有特定字段的文档
-排他性:[* TO *]
- 我想获取所有具有该字段并获得特定值的文档
排他性:(无)
所以当我尝试查询 Solr 4 时:
fq=(-exclusivity:[* TO *]) OR exclusivity:(None)
如果字段存在于文档中并且值为 None 但结果不包含第一次查询的结果,我只会得到结果!
我不明白为什么它不起作用
【问题讨论】:
我正在尝试使用以下要求查询 Solr: _ 我想获取所有没有特定字段的文档
-排他性:[* TO *]
排他性:(无)
所以当我尝试查询 Solr 4 时:
fq=(-exclusivity:[* TO *]) OR exclusivity:(None)
如果字段存在于文档中并且值为 None 但结果不包含第一次查询的结果,我只会得到结果!
我不明白为什么它不起作用
【问题讨论】:
为了解释您的结果,查询(-exclusivity:[* TO *]) 将始终没有结果,因为您没有指定要检索的任何结果。默认情况下,Lucene 不会检索任何结果,除非您告诉它获取它们。 exclusivity:(None) 不是对完整结果集的限制,它是用于查找要检索的文档的键。这与数据库不同,数据库默认返回表中的所有记录,并允许您限制集合。
(-exclusivity:[* TO *]) 只指定不获取什么,但根本不告诉它获取任何东西。
Solr 具有处理纯否定查询的逻辑(我相信,与下面的方式大致相同,首先隐式检索所有文档),但从我收集的内容来看,仅作为顶级查询,它不处理查询比如term1 OR -term2documented here。
我相信使用 solr,您应该能够使用查询 *:* 来获取所有文档(尽管这在原始 lucene 中不可用),因此您可以使用查询:
(*:* -exclusivity:[* TO *]) exclusivity:(None)
这意味着,获取(除具有排他性值的文档之外的所有文档)或排他性 = "None" 的文档
【讨论】:
*:* 的解决方法 -- 使用每个文档中的字段。例如,如果alltext 在每个文档中,那么查询alltext:* 将检索所有文档
BooleanQuery 中的Queryperser.parse 的结果合并。这样一来,您就不需要在索引中添加一个虚拟字段,或者允许使用前导通配符,或者可能对实际数据的性质做出不安全的假设,我不愿意这样做。
我已经找到了这个问题的答案。我做了一个错误的假设,“-”在 solr 中是如何工作的。我认为
-排他性:[* TO *]
将没有排他性字段的所有内容添加到数据集中,但事实并非如此。 '-' 只能从数据集中排除事物。顺便说一句,femtoRgon 你是对的,但我将它用作 fq(过滤器查询)而不是主查询,我忘记提及这一点。
所以解决方案是这样的
-排他性:([* TO *] AND -(None))
完整的查询看起来像
/?q=*:*&fq=-exclusivity:([* TO *] AND -(None))
这意味着我将得到所有不具有字段排他性或具有此字段并且填充值 None。
【讨论】: