摘要:实现聚合通过实现聚合,详情可见文档有时候查询数据的时候可能需要实现多字段的功能,例如要实现多个维度的聚合,需要嵌套的查询语句设置一个大的分桶数,防止一次统计不完整用函数构建聚合语句的部分处理得到的数据,将其组织成
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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45168.html
摘要:开发环境这里讲的是实战对于如何安装,配置环境变量,配置不做讲解详细请查看学习笔记四在上安装和启动增量同步数据到方式实现从零到一超级详里面有做详细讲解,对于搭建集群目前还没有写相关文章,读者可以自行在项目的文件中添加的依赖实现员工信息 开发环境: elasticsearch:7.0.0kibana:7.0.0JDK: 1.8.0_201maven: 3.6.1 这里讲的是实战对于如何安装...
阅读 916·2021-09-07 09:58
阅读 1447·2021-09-07 09:58
阅读 2847·2021-09-04 16:40
阅读 2477·2019-08-30 15:55
阅读 2387·2019-08-30 15:54
阅读 1344·2019-08-30 15:52
阅读 386·2019-08-30 10:49
阅读 2577·2019-08-29 13:21