ELK,萌萌哒

elasticsearch聚合问题,sum之后进行range

Elasticsearch | 作者 steven123 | 发布于2017年05月03日 | 阅读数:6825

目前有这样一个场景,有imsi,num这两个字段,然后要将imsi相同的num进行累加,累加之后的值在进行range。
比如如下几行数据:
   "imsi":"112233",
   "num":"4"

   "imsi":"112233",
   "num":"15"

   "imsi":"221133",
   "num":"6"

   "imsi":"221133",
   "num":"2"

   "imsi":"332211",
   "num":"25"

   "imsi":"332211",
   "num":"10"

   "imsi":"123123",
   "num":"59"

累加之后:
40-60 123123 num_sum:59
0-20 221133 num_sum:8 112233 num_sum:19
20-40 332211 num_sum:35

之前我对agg理解:
"range":{
                     "field":"num",
                    "ranges":[
                                    {"to":0},
                                    {"from":20,"to":40},
                                    {"from":80}]
                 }
这里的field只能对docment内的字段有用,无法对聚合后的数值(num_sum)起作用,不知道各位大神知不知道解决办法,小弟不胜感激。


 
已邀请:

medcl - 今晚打老虎。

赞同来自:

对聚合后的结果再操作,只能采用 pipeline 的方式进行再聚合,
如果你的 range 范围是已知的,你可以尝试使用 bucket_script 来进行:
1.有一个 range,就定义几个 bucket_script
2.每个 script 对前面的 sum 数据进行判断,符号对应 range 的,对 num 值进行 计算 count 或是计算 sucm,返回你要的值
 
每个 bucket_script 就对应一个 range 内的结果

yj7778826 - 苦逼小运维

赞同来自:

同关注这个问题。。。

medcl - 今晚打老虎。

赞同来自:

动手试了一下,bucket_script可能不适合,而bucket_select可以对sum之后的进行选择,但是很遗憾,目前不支持多个bucket_select, 提供一个比较挫的做法:
DELETE abc
POST abc/t/1
{"imsi":"112233",
"num":4}

POST abc/t/2
{"imsi":"112233",
"num":15
}


POST abc/t/3
{"imsi":"112234",
"num":9
}


GET abc/_search
{
"size": 0,
"aggs": {
"imsi_less_10": {
"terms": {
"field": "imsi.keyword",
"size": 10
},
"aggs": {
"sum_num": {
"sum": {
"field": "num"
}
},
"filtered": {
"bucket_selector": {
"buckets_path": {
"my_var1": "sum_num"
},
"script": "params.my_var1 <10"
}
}
}
},
"imsi_gt_10": {
"terms": {
"field": "imsi.keyword",
"size": 10
},
"aggs": {
"sum_num": {
"sum": {
"field": "num"
}
},
"filtered": {
"bucket_selector": {
"buckets_path": {
"my_var1": "sum_num"
},
"script": "params.my_var1 >10"
}
}
}
}
}
}

 
结果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0,
"hits":
},
"aggregations": {
"imsi_less_10": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "112234",
"doc_count": 1,
"sum_num": {
"value": 9
}
}
]
},
"imsi_gt_10": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "112233",
"doc_count": 2,
"sum_num": {
"value": 19
}
}
]
}
}
}

要回复问题请先登录注册