【问题标题】:using OR and NOT in solr query在 solr 查询中使用 OR 和 NOT
【发布时间】:2010-10-12 16:41:49
【问题描述】:

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

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

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

有人能解释一下为什么 solr 没有返回这种查询的结果吗?是否应该以某种方式重组查询 - 或者是否有不同的方式可以使用 solr 来实现所需的结果?

【问题讨论】:

    标签: search lucene solr


    【解决方案1】:

    简单的做 id:("12345") OR id:("7890") ....等等

    【讨论】:

      【解决方案2】:

      只是添加另一个意外情况,这里是没有返回预期结果的查询:

      *:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )
      

      field_b 在我的情况下是我执行的构面,并且需要在该类型(bar)上定位查询词“foo”only

      我必须在 or 条件之后插入 另一个 *:* 才能使其正常工作,如下所示:

      *:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )
      

      编辑:这是在 solr 6.6.3 中

      【讨论】:

        【解决方案3】:

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

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

        最大的警告是 Solr 只检查顶级查询是否是纯否定查询! 所以这意味着像bar OR (-foo) 这样的查询不会更改,因为纯否定查询位于顶级查询的子句中。您需要自己将此查询转换为bar OR (*:* -foo)

        您可以查看 solr 查询说明来验证查询转换:

        ?q=-title:foo&debug=query
        

        转化为

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

        【讨论】:

        • edismax 正确处理嵌套的纯否定查询,对吗?有没有讨论过修补 Lucene 查询解析器以同样的方式支持这些?
        【解决方案4】:

        在这里,在 Solr 文档和另一个 SO 问题中,将来自几个不同答案的 cmets 放在一起,我发现以下语法为我的用例产生了正确的结果

        (my_field=my_value 或 my_field 为空):

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

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

        【讨论】:

        • 今天在 Solr 5 中遇到了这种情况,这个建议有效。
        【解决方案5】:
        Instead of "NOT [condition]" use "(*:* NOT [condition])"
        

        【讨论】:

        • 非常感谢!这个方法对我有用,即使是复杂的查询,而 -(myField:superneat AND -myOtherField:somethingElse) 方法 - 没有!
        【解决方案6】:

        您可以在solr user mailling list 上找到 solr-user 组的后续信息

        普遍的想法是 NOT 运算符只能用于从查询中删除结果 - 而不仅仅是从整个数据集中排除事物。我碰巧喜欢你建议的 mausch 语法 - 谢谢!

        【讨论】:

          【解决方案7】:

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

          -(myField:superneat AND -myOtherField:somethingElse)
          

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

          尝试在solr-user group 中提问,然后在此处回复最终答案!

          【讨论】:

          • 感谢您的帮助!这确实有效 - 我已将其提交给 solr-user 组。我会在这里发布我从他们那里听到的任何有用的信息。
          • 请注意,-myField:superneat OR myOtherField:somethingElse 也是一样的,而且稍微简单一些。
          • @YorickSijsling 的重点是,即使逻辑上等价,Solr 有时也不能很好地处理纯粹的否定查询,例如 OP 发布的查询或您发布的查询。
          • @Mauricio Scheffer - 我会完全质疑这一点。你能解释一下它是如何处理得不好的吗?我们在这里运行了相当复杂的条件,发现它可以很好地处理数十亿个文档。
          • @terrance.a.snyder "复杂条件" != "纯否定查询"。此外,最近版本的 Solr 可能有所改进,我还没有检查过。
          猜你喜欢
          • 2012-05-28
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2013-01-11
          相关资源
          最近更新 更多