Elastic Search中的过滤器分组

时间:2018-07-24 12:42:00

标签: elasticsearch filter aggregation

我有一个查询,该查询根据给定的过滤器汇总数据,如下所述。

{
  "size": 0,
  "aggs": {
    "country": {
      "terms": {
        "field": "country",
        "size": 10,
        "order": {
          "messages": "desc"
        }
      },
          "aggs": {
            "messages": {
              "sum": {
                "field": "count"
              }
            }
          }
        }
    }
  },
  "query": {
    "bool": {
      "must": [],
      "filter": [
        {
          "terms": {
            "country": [
              "US", "FR"
            ]
          }
        },
        {
          "terms": {
            "locale": [
              "en_US", "en_FR"
            ]
          }
        }
      ]
    }
  }
}

此查询返回的两个国家的所有数据都具有语言环境(我在过滤器中提到)数据

like:US-> en_US,en_FR和FR-> en_US,en_FR。

现在我想获取 US-> en_US和FR-> en_FR 的数据(这需要在查询的Filters逻辑中进行构造)。并且还需要相应地进行汇总(基于国家/地区和过滤条件)

为此,我正在努力寻找或构架Elastic search中的查询。 任何建议都会有帮助

1 个答案:

答案 0 :(得分:0)

您可以这样做:

{
  "size": 0,
  "aggs": {
    "country": {
      "terms": {
        "field": "country",
        "size": 10,
        "order": {
          "messages": "desc"
        }
      },
      "aggs": {
        "messages": {
          "sum": {
            "field": "count"
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [],
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "country": "US"
                }
              },
              {
                "term": {
                  "locale": "en_US"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "country": "FR"
                }
              },
              {
                "term": {
                  "locale": "en_FR"
                }
              }
            ]
          }
        }
      ]
    }
  }
}