资讯专栏INFORMATION COLUMN

Python 实现elasticsearch group by

wayneli / 3144人阅读

摘要:实现聚合通过实现聚合,详情可见文档有时候查询数据的时候可能需要实现多字段的功能,例如要实现多个维度的聚合,需要嵌套的查询语句设置一个大的分桶数,防止一次统计不完整用函数构建聚合语句的部分处理得到的数据,将其组织成

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/34516.html

相关文章

  • Python 实现elasticsearch group by

    摘要:实现聚合通过实现聚合,详情可见文档有时候查询数据的时候可能需要实现多字段的功能,例如要实现多个维度的聚合,需要嵌套的查询语句设置一个大的分桶数,防止一次统计不完整用函数构建聚合语句的部分处理得到的数据,将其组织成 es实现聚合 es通过agg实现聚合,详情可见 es文档 有时候查询es数据的时候可能需要实现多字段group by的功能,例如: SELECT sum(item_coun...

    kelvinlee 评论0 收藏0
  • Elasticsearch如何实现SQL语句中 Group By 和 Limit 的功能

    摘要:语句中还有一项是用于计算每个的颜色数,在中我们需要使用一个指标类聚合,进行不同值计数。在中可以使用聚合实现,语句如下所示返回结果如下至此我们便将语句实现的功能用查询语句实现了。 有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大...

    张春雷 评论0 收藏0
  • Elasticsearch如何实现SQL语句中 Group By 和 Limit 的功能

    摘要:语句中还有一项是用于计算每个的颜色数,在中我们需要使用一个指标类聚合,进行不同值计数。在中可以使用聚合实现,语句如下所示返回结果如下至此我们便将语句实现的功能用查询语句实现了。 有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQL 来实现,然后再去想 Elasticsearch 的 Query DSL 如何实现。那么本篇就给大...

    张利勇 评论0 收藏0
  • Elasticsearch实战Java High Level REST Client实现员工管理案例

    摘要:开发环境这里讲的是实战对于如何安装,配置环境变量,配置不做讲解详细请查看学习笔记四在上安装和启动增量同步数据到方式实现从零到一超级详里面有做详细讲解,对于搭建集群目前还没有写相关文章,读者可以自行在项目的文件中添加的依赖实现员工信息 开发环境: elasticsearch:7.0.0kibana:7.0.0JDK: 1.8.0_201maven: 3.6.1 这里讲的是实战对于如何安装...

    Barry_Ng 评论0 收藏0
  • 【01】把 Elasticsearch 当数据库使:表结构定义

    摘要:在一定场合下可以替代做为的用途。但是其官方查询语法并不是,而是一种独创的。在本章中,我们先来准备好样本数据。选择的样本数据是全美的股票列表。执行导入从的角度,和表结构定义是非常类似的。做为数据库最大的区别是的关系,以及通配这些。 Elaticsearch 有非常好的查询性能,以及非常强大的查询语法。在一定场合下可以替代RDBMS做为OLAP的用途。但是其官方查询语法并不是SQL,而是一...

    Object 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<