【问题标题】:SOLR/Lucene Facet Query - ORs and NOTsSOLR/Lucene Facet 查询 - ORs 和 NOTs
【发布时间】:2015-11-30 17:48:55
【问题描述】:

我有一个行为异常的 SOLR 搜索。当我进入 SOLR 管理并运行以下搜索时,我得到了一个奇怪的行为(请注意,myField__s 只有两个可能的值,MyValue1MyValue2)。

// 13,461 found - Good
fq:

// 9,168 found - Good
fq: myField__s:"MyValue1"

// 4,293 found - Good
fq: NOT myField__s:"MyValue1"

// 0 found - Bad, expected 13,461
fq: myField__s:"MyValue1" OR NOT myField__s:"MyValue1"

// 9,168 found - Good
fq: myField__s:"MyValue1" OR NOT myField__s:"MyValue2"

// 9,168 found - Bad, expected 13,461
fq: myField__s:"MyValue1" OR (NOT myField__s:"MyValue1")

我觉得我在 fq 语法方面遗漏了一些重要的东西。任何人都可以提供任何指导吗?

【问题讨论】:

  • 你最后的结果让我有点吃惊。我原以为 Solr 处理了这种情况。不过,this answer 可能会为您指明正确的方向,为什么在 Solr 中的 NOT 查询可能有点难以预测。
  • 我想我明白了,但 (myField__s:"MyValue1") OR (NOT (myField__s:"MyValue1")) 通过 SOLR 转换为 myField__s:MyValue1 (-myField__s:MyValue1)。阅读事物和您发布的答案让我认为这应该可行。 2个“主要”组件没有+或-所以它们应该是应该的。内部部分应该采取整套并删除与“MyValue1”匹配的任何内容。因此,这 2 个应该作为一个整体组合在一起。没有?
  • 是的,这也让我感到惊讶。如果您手动添加所有匹配项,您可能会有一些运气。比如:myField__s:MyValue1 (*:* -myField__s:MyValue1)
  • myField__s:"MyValue1" OR (*:* AND NOT myField__s:"MyValue1") 确实按预期返回了所有结果。我想我必须手动将其添加到查询中的任何 NOT 中。谢谢你。如果您将其添加为答案,我会标记它。

标签: solr lucene


【解决方案1】:

Solr 为布尔搜索 MUST、SHOULD 和 MUST_NOT 提供了免费选项。如果您在某个词之前包含 NOT 前缀,这意味着您使用 MUST_NOT 选项将其添加到布尔查询中,因此具有该词的文档将从搜索结果中排除。 (前缀 AND 变为 MUST 选项,前缀 OR 变为 SHOULD OPTION)。换句话说查询字符串

myField__s:"MyValue1" OR NOT myField__s:"MyValue1"

将被解析为

myField__s:"MyValue1" -myField__s:"MyValue1".

您可以在 solr 响应的 fq 字段中看到转换后的查询

{
  "responseHeader":{
    "status":0,
    "QTime":11,
    "params":{
      "debugQuery":"true",
      "indent":"true",
      "q":"some query",
      "wt":"json",
      "fq":"myField__s:MyValue1 -myField__s:MyValue1"],
......

【讨论】:

  • 谢谢。出于某种原因,我们的 SOLR 管理员没有显示 params。您知道实施我正在尝试的正确方法吗?
  • 尝试将 &debugQuery=true 添加到查询请求中,这将在响应末尾显示解析器查询。但它只对 q 有效,对 fq 无效。
  • 这很有帮助,但仍在尝试解决 - lucidworks.com/blog/2011/12/28/why-not-and-or-and-not
  • 在 solr 管理员中找到一个复选框。现在可以看到filter_queriesparsed_filter_queries。看起来myField__s:"MyValue1" OR (NOT (myField__s:"MyValue1")) 被解析为myField__s:MyValue1 (-myField__s:MyValue1)。我认为这应该是正确的,但它仍然没有返回正确数量的结果。
  • 查询 myField__s:MyValue1 (-myField__s:MyValue1) 应该返回零个结果,因为它应该由带有和不带有术语 myField__s:MyValue1 的文档组成。无论如何,如果您在查询中的 term 之前有 NOT,则查询结果将不包含具有该 term 的文档。
猜你喜欢
  • 2011-10-18
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多