2017-08-15 73 views
0

假设我在ES中有这些数据。按用户定义的组elasticsearch聚合

| 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

有这样做的至少有两种方式:

  1. 如果群体是固定的,你可以组名添加到每个文档,然后第一汇总计算组,然后在值。
  2. 如果您想要更动态的方法,可以使用filter + regexp对结果进行分组。看到这里例如:使用https://www.elastic.co/blog/quick-tips-regex-filter-buckets

两个例子过滤器:

{ 
    "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" 
      } 
     } 
     } 
    } 
    } 
} 
+0

谢谢,但是现在的情况是,我不能给文档添加任何东西并且组关系数据从另一个数据库中获取。这个小组没有任何模式。 –

+0

@JasonYoung添加使用过滤器聚合的示例。这是你所要求的那种行为吗? – Peter

+0

不错!那就对了。 2是我想要的! –