python elasticsearch_Python 实现elasticsearch group by

es实现聚合

es通过agg实现聚合,详情可见 es文档

有时候查询es数据的时候可能需要实现多字段group by的功能,例如:

SELECT sum(item_count) from A group by field1, field2, field3

要实现多个维度的聚合,需要嵌套的agg查询语句:

{

"query": {

},

"aggs": {

"field1": {

"terms": {

"field": "field1",

"size": 2147483647 #设置一个大的分桶数,防止一次统计不完整

},

"aggs": {

"field2": {

"terms": {

"field": "field2",

"size": 2147483647

},

"aggs": {

"field3": {

"terms": {

"field": "field3",

"size": 2147483647

},

"aggs": {

"sum_field": {

"sum": {

"field": "sum_field"

}

}

}

}

}

}

}

}

},

"size": 0

}

用函数构建聚合语句的agg部分:

def build_query_aggs(fields, sum_field):

agg_data = {}

curr_field = agg_data

for item in fields:

curr_field[item] = {

"terms": {

"field": item,

"size": 2147483647

},

"aggs": {}

}

curr_field = curr_field[item]["aggs"]

curr_field[sum_field] = {

"sum": {

"field": sum_field

}

}

return agg_data

处理得到的数据,将其组织成list:

def build_es_aggs_data(data, fields, sum_field):

curr_field = None

res_data = []

if len(fields) > 0:

curr_field = fields[0]

else:

return

curr_buckets = data[curr_field]['buckets']

for item in curr_buckets:

if len(fields) == 1:

curr_data= {}

curr_data[curr_field] = item['key']

curr_data[sum_field] = item[sum_field]["value"]

res_data.append(curr_data)

else:

pre_data = deepcopy(build_es_aggs_data(item, fields[1:], sum_field))

for pre_item in pre_data:

pre_item[curr_field] = item['key']

res_data.append(pre_item)

return res_data

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值