用户定义的组

时间:2017-08-15 10:18:43

标签: elasticsearch

假设我在ES中有这些数据。

| KEY        | value       |
|:-----------|------------:|
| A          |            1|
| A          |            2|
| B          |            2| 
| C          |            3|   
| D          |            4| 
| E          |            5|  
| E          |            5|  
| F          |            6|

我用这个

{
  "from": 0,
  "size": 0,
  "query": {
    "filtered" : {
      "query" : {
          "match_all" : {} 
      },
      "filter" : {
        "bool" : {
          "must" : [
            {"terms": {"key": ["A", "B", "C", "D", "E", "F"]}}
          ]
        }
      }
    }
  },
  "aggs" : {
    "sum_value" : {
      "terms" : { "field" : "key" },
      "aggs" : {
        "sum_value" : { "sum" : { "field" : "value" } }
      }
    }
  }
}

获取相同键的总和,结果如下所示:

"sum_uv": {
  "doc_count_error_upper_bound": 0,
  "sum_other_doc_count": 0,
  "buckets": [
    {
      "key": "A",
      "doc_count": 2,
      "sum_value": {
        "value": 3
      }
    }
    ....
  ]
}

但是现在,我想要汇总同一组中的所有元素,例如,我有一个映射数据,它告诉我组信息:

group1 = [A, B, C]
group2 = [D, E, F]
.....

我认为我需要一个嵌套聚合用于此目的,但我不知道这样做。

结果如下:

sum_group1 = 8
sum_group2 = 20
......

提前致谢!

1 个答案:

答案 0 :(得分:1)

至少有两种方法可以做到这一点:

  1. 如果组已修复,您可以将组名添加到每个文档,然后首先在组上聚合,然后在值上聚合。
  2. 如果您想要更加动态的方法,可以使用filter + regexp对结果进行分组。请参阅此处的示例:https://www.elastic.co/blog/quick-tips-regex-filter-buckets
  3. 使用过滤器的两个例子:

    1

    {
      "size": 0,
      "aggs": {
        "groups": {
          "filters": {
            "filters": {
              "group1": { "terms": { "key": [ "A","B","C" ] } },
              "group2": { "terms": { "key": [ "D","E","F" ] } }
            }
          },
          "aggs": {
            "groupsum": {
              "sum": {
                "field": "key"
              }
            }
          }
        }
      }
    }
    

    2

    {
      "size": 0,
      "query": {
        "match_all": { }
      },
      "aggs": {
        "group1": {
          "filter": {
            "terms": {
              "key": [ "A", "B", "C" ]
            }
          },
          "aggs": {
            "group1sum": {
              "sum": {
                "field": "value"
              }
            }
          }
        },
        "group2": {
          "filter": {
            "terms": {
              "key": [ "D", "E", "F" ]
            }
          },
          "aggs": {
            "group2sum": {
              "sum": {
                "field": "value"
              }
            }
          }
        }
      }
    }