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

    你可能感兴趣的文章
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>