【问题标题】:Are multiple Groups of Should possible in elastic search在弹性搜索中是否可以使用多组应该
【发布时间】:2022-03-21 19:45:24
【问题描述】:

我正在使用弹性搜索 6.5。

我正在尝试组合一个查询,该查询将执行以下操作:

搜索文档

  • 主键值必须是 85、0、95 或 3。
  • 其中 sub key1 值必须以 4444 或空字符串开头。或者,
  • 其中第二个 sub key2 值必须以 5555 或空字符串开头。

它还包括一些日期范围标准。

我觉得我需要两组“应该”。因为两个组中必须至少出现 1 个匹配项。但它们不能组合..因为至少 1 个子键也必须匹配。下面的“必须”是不正确的,因为它“应该”是一个应该,但两组应该是不可能的。

知道我该怎么做吗?

我把这个查询放在一起:

{
  "size" : 200, "from": 0,
  "query":{
        "bool": {
            "should": [{ "term": { "primary_key": "84"}},  
                       { "term": { "primary_key": "3"}},
                       { "term": { "primary_key": "0"}},
                       { "term": { "primary_key": "95"}}],
            
            "must":   [{ "match_phrase_prefix": { "subkey1" : "65200010100780"}}, 
                       { "match_phrase_prefix": { "subkey2" : "00228315303"}}],
                     
          "filter": [  { "range": { "start_date": { "lte": "2018-11-01" }}},
                       { "range": { "end_date": { "gt": "2018-11-01"}}}] 
        }
  }

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    由于两组“应该”中至少有一个匹配项,我会这样做,在bool/must 子句中有两个bool/should

    {
      "size": 200,
      "from": 0,
      "query": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "term": {
                      "primary_key": "84"
                    }
                  },
                  {
                    "term": {
                      "primary_key": "3"
                    }
                  },
                  {
                    "term": {
                      "primary_key": "0"
                    }
                  },
                  {
                    "term": {
                      "primary_key": "95"
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "match_phrase_prefix": {
                      "subkey1": "65200010100780"
                    }
                  },
                  {
                    "match_phrase_prefix": {
                      "subkey2": "00228315303"
                    }
                  }
                ]
              }
            }
          ],
          "filter": [
            {
              "range": {
                "start_date": {
                  "lte": "2018-11-01"
                }
              }
            },
            {
              "range": {
                "end_date": {
                  "gt": "2018-11-01"
                }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 谢谢.. 不知道您可以嵌套这些子句... 这有帮助。
    • bool 查询是绝对可以嵌套的常规查询
    猜你喜欢
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多