博客
关于我
Elasticsearch 聚合
阅读量:443 次
发布时间:2019-03-06

本文共 5030 字,大约阅读时间需要 16 分钟。

Elasticsearch 聚合操作指南

目录

  • 前言
    1. 聚合类型分类
      1. 聚合结构
        1. 测试数据
          1. Bucket Aggregation
            1. Metric Aggregation
              1. Pipeline Aggregation
                1. 排序
                  1. 聚合分析的原理及精准度问题
                    1. 资料

1. 前言

聚合是一种基于搜索的数据汇总技术,通过组合可以完成复杂的数据分析操作。与传统的数据库查询不同,聚合操作更注重数据的汇总和统计,而不是单个文档的检索。通过聚合,我们可以快速获得数据的概览,而不是逐一分析每个文档。


2. 聚合类型分类

Elasticsearch 的聚合操作分为以下几类,每种类型有其独特的应用场景:

  • Bucket Aggregation:类似于 group by,用于将文档分组。例如,根据目的地(DestCountry)进行分组,查看航班数量。
  • Metric Aggregation:用于对文档字段进行数学统计分析,如最大值、最小值、总和、平均值等。
  • Pipeline Aggregation:对之前的聚合结果再进行二次聚合,用于更复杂的数据分析。
  • Matrix Aggregation:支持对多个字段的操作并提供结果矩阵,但在7.x版本后已被合并至 Metric Aggregation。

3. 聚合结构

Elasticsearch 聚合操作的结构通常如下:

{    "size": 0,  // 表示不返回文档,仅用于聚合操作    "aggs": {        "聚合名称": {            "类型": {                "参数": {                    // 子聚合或其他配置                }            }        }    }}
  • size:通常设置为 0,表示不返回文档,聚合操作仅用于统计。
  • aggs:聚合操作的主体,包含多个聚合。
  • 聚合名称:自定义聚合名称,用于区分不同的聚合操作。
  • 类型:定义聚合类型,如 terms(分组)、max(最大值)、histogram(时间区间分组)等。

4. 测试数据

为了更好地理解聚合操作,可以使用以下数据集进行测试:

  • 数据集kibana_sample_data_flights
  • 字段
    • DestCountry:目的地国家
    • AvgTicketPrice:平均票价
    • timestamp:时间戳
    • DistanceKilometers:距离(公里)

导入路径

  • 进入 Kibana 主页。
  • 点击 添加数据
  • 选择 样例数据
  • 导入 Sample flight data

  • 5. Bucket Aggregation

    1. 子聚合

    根据目的地国家分组,统计航班数量:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "dest_count": {            "terms": {                "field": "DestCountry"            }        }    }}

    2. 数字区间分组

    根据票价区间分组,例如 0-100 元和 100-200 元:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "price_stat": {            "histogram": {                "field": "AvgTicketPrice",                "interval": 100            }        }    }}

    3. 日期区间分组

    根据时间戳进行月度分组:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "price_stat": {            "date_histogram": {                "field": "timestamp",                "calendar_interval": "month"            }        }    }}

    6. Metric Aggregation

    1. 最值

    统计航班的最大票价和最小票价:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "max_price": {            "max": {                "field": "AvgTicketPrice"            }        },        "min_price": {            "min": {                "field": "AvgTicketPrice"            }        }    }}

    2. 嵌套操作

    统计每个目的地的最大票价和最小票价:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "dest_count": {            "terms": {                "field": "DestCountry"            },            "aggs": {                "max_price": {                    "max": {                        "field": "AvgTicketPrice"                    }                },                "min_price": {                    "min": {                        "field": "AvgTicketPrice"                    }                }            }        }    }}

    3. 统计信息

    一次性输出多个统计结果:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "my_stats": {            "stats": {                "field": "AvgTicketPrice"            }        }    }}

    4. 去重后数量统计

    统计目的地国家的去重数量:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "my_cardinality": {            "cardinality": {                "field": "DestCountry"            }        }    }}

    5. 最多返回的文档

    获取每个国家的最小票价,返回最多的两个国家:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "my_count": {            "terms": {                "field": "DestCountry",                "size": 5            },            "aggs": {                "my_min_price": {                    "top_hits": {                        "size": 2,                        "sort": [                            {                                "AvgTicketPrice": {                                    "order": "asc"                                }                            }                        ]                    }                }            }        }    }}

    6. 自定义范围分组

    根据票价范围分组:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "my_price_range": {            "range": {                "field": "AvgTicketPrice",                "ranges": [                    {                        "to": 200                    },                    {                        "from": 200,                        "to": 500                    },                    {                        "key": ">500",                        "from": 500                    }                ]            }        }    }}

    7. 百分位聚合

    查看票价的百分位分布:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "my_price_percentiles": {            "percentiles": {                "field": "AvgTicketPrice",                "percents": [1, 5, 25, 50, 75, 95, 99]            }        }    }}

    8. 地理边界聚合

    查看目的地的地理边界:

    GET kibana_sample_data_flights/_search {    "size": 0,    "aggs": {        "my_geo_bounds": {            "geo_bounds": {                "field": "DestLocation",                "wrap_longitude": true            }        }    }}

    9. 聚合分析的原理及精准度问题

    问题

    • Terms 聚合不准确的原因:数据分布在多个分片上,协调节点无法获取所有数据。
    • 解决方法
      • primary_shard 设置为 1,确保数据集中在单个分片上。
      • 在分布式环境中,设置 shard_size 参数,提高精确度。

    10. 资料

    • 书籍:《Elasticsearch 核心技术与实战》(作者:阮一鸣,发布平台:极客时间)

    转载地址:http://jlufz.baihongyu.com/

    你可能感兴趣的文章
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>