【问题标题】:ElasticSearch bool should_not filterElasticSearch bool should_not 过滤器
【发布时间】:2016-05-05 19:37:13
【问题描述】:

我是 elasticsearch 的新手,所以我的问题是:

bool 过滤器有 3 个部分:

必须 所有这些子句都必须匹配。相当于 AND。 禁止 所有这些子句都不能匹配。相当于NOT。 应该 这些子句中至少有一个必须匹配。相当于 OR。

如何执行“should_not”查询?

提前致谢:)

【问题讨论】:

  • 请解释您对“不应该”的定义

标签: elasticsearch boolean range


【解决方案1】:

要获得类似“should_not”的信息,请尝试以下查询:

获取 /bank/account/_search { “大小”:2000, “询问”: { “布尔”:{ “必须”: { “匹配全部”:{} }, “应该”: { “布尔”:{ “禁止”: { “匹配”: { “城市”:“XYZ” } } } } } } }

在这种情况下,子句“必须”需要检索所有结果(城市“XYZ”的结果也是如此),但该特定结果的分数降低。

【讨论】:

  • 您将如何处理嵌套查询?
【解决方案2】:

这取决于您希望“不应该”发挥多大作用。

由于should 大致相当于一个布尔OR(即返回A、B 或C 为真的文档),那么考虑“should_not”的一种方式大致相当于NOT(A OR B或 C)。在布尔逻辑中,这与 NOT A AND NOT B AND NOT C 相同。在这种情况下,只需将所有子句添加到 bool 过滤器的 must_not 部分即可完成“should_not”行为。

【讨论】:

  • 这意味着完成 should_not 要求您始终将子句包装在另一个 bool 查询中。这可行,但从 API 的角度来看很烦人。您只是想要一个子句的否定,但您正在使用 Bool 查询来完成它。当您只有一个子句时,这感觉很奇怪。例如,您想要返回 (A ∨ B ∨ (¬C)) 的文档。在 elasticsearch 中不推荐使用 NOT 查询,并用诸如 must_not 之类的 Bool 查询中的调用替换,但他们从未添加过 should_not。
【解决方案3】:

这个查询类似于sql 其中 categoryId= "category123" AND (localeId != "de_DE" OR productId != "productMediatest-productid01")

{
  "query": {
   "bool": {
  "must": [
    {
      "term": {
        "categoryId": "category123"
      }
    },
    {
      "bool": {
        "should": [
          {
            "bool": {
              "must_not": {
                "term": {
                  "localeId": "de_DE"
                }
              }
            }
          },
          {
            "bool": {
              "must_not": {
                "term": {
                  "productId": "productMediatest-productid01"
                }
              }
            }
          }
        ]
      }
    }
  ]
}
}
}

【讨论】:

    【解决方案4】:

    您可以应用 not 过滤器,然后为 should_not 操作应用 should 过滤器。

      "filter": {
           "not": {
              "filter": {
                  "bool": {
                      "should": [
                         {}
                      ]
                  }
              }
           }
       }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多