【问题标题】:Lucene OR query not workingLucene OR 查询不起作用
【发布时间】:2013-01-25 04:02:01
【问题描述】:

我正在尝试使用以下要求查询 Solr: _ 我想获取所有没有特定字段的文档

-排他性:[* TO *]

  • 我想获取所有具有该字段并获得特定值的文档

排他性:(无)

所以当我尝试查询 Solr 4 时:

fq=(-exclusivity:[* TO *]) OR exclusivity:(None)

如果字段存在于文档中并且值为 None 但结果不包含第一次查询的结果,我只会得到结果!

我不明白为什么它不起作用

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    为了解释您的结果,查询(-exclusivity:[* TO *]) 将始终没有结果,因为您没有指定要检索的任何结果。默认情况下,Lucene 不会检索任何结果,除非您告诉它获取它们。 exclusivity:(None) 不是对完整结果集的限制,它是用于查找要检索的文档的键。这与数据库不同,数据库默认返回表中的所有记录,并允许您限制集合。

    (-exclusivity:[* TO *]) 只指定不获取什么,但根本不告诉它获取任何东西。

    Solr 具有处理纯否定查询的逻辑(我相信,与下面的方式大致相同,首先隐式检索所有文档),但从我收集的内容来看,仅作为顶级查询,它不处理查询比如term1 OR -term2documented here

    我相信使用 solr,您应该能够使用查询 *:* 来获取所有文档(尽管这在原始 lucene 中不可用),因此您可以使用查询:

    (*:* -exclusivity:[* TO *]) exclusivity:(None)
    

    这意味着,获取(除具有排他性值的文档之外的所有文档)或排他性 = "None" 的文档

    【讨论】:

    • 原始 Lucene 中 *:* 的解决方法 -- 使用每个文档中的字段。例如,如果alltext 在每个文档中,那么查询alltext:* 将检索所有文档
    • @MarkLeightonFisher 一个更好的方法是使用MatchAllDocsQuery,它可以根据需要轻松地与BooleanQuery 中的Queryperser.parse 的结果合并。这样一来,您就不需要在索引中添加一个虚拟字段,或者允许使用前导通配符,或者可能对实际数据的性质做出不安全的假设,我不愿意这样做。
    【解决方案2】:

    我已经找到了这个问题的答案。我做了一个错误的假设,“-”在 solr 中是如何工作的。我认为

    -排他性:[* TO *]

    将没有排他性字段的所有内容添加到数据集中,但事实并非如此。 '-' 只能从数据集中排除事物。顺便说一句,femtoRgon 你是对的,但我将它用作 fq(过滤器查询)而不是主查询,我忘记提及这一点。

    所以解决方案是这样的

    -排他性:([* TO *] AND -(None))

    完整的查询看起来像

    /?q=*:*&fq=-exclusivity:([* TO *] AND -(None))

    这意味着我将得到所有不具有字段排他性或具有此字段并且填充值 None。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      相关资源
      最近更新 更多