博客
关于我
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/

    你可能感兴趣的文章
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
    查看>>
    Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
    查看>>
    Openlayers中加载GeoJson文件显示地图
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    OpenLayers学习三:地图旋转及地图跳转到某一点的方式(以类为接口)
    查看>>
    Openlayers实战教程学习大纲及引导
    查看>>
    Openlayers实战:LayerGroup添加删除显示隐藏
    查看>>
    Openlayers实战:loadstart和loadend事件
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers实战:moveend事件,利用calculateExtent获取地图左上和右下的坐标
    查看>>