弹性搜索中是否应有多个

时间:2018-11-19 04:42:54

标签: elasticsearch

我正在使用弹性搜索6.5。

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

中搜索文档
  • 主键值必须为85、0、95或3。
  • 其中子key1值必须以4444开头或为空字符串。或者,
  • 其中第二个子key2值必须以5555或空字符串开头。

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

我觉得我需要两组“应该”。因为两组都必须至少有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"}}}] 
        }
  }

1 个答案:

答案 0 :(得分:0)

由于在两组“应该”中都必须至少进行一次匹配,因此我会这样做,在bool/should子句中使用两个bool/must

{
  "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"
            }
          }
        }
      ]
    }
  }
}