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

    你可能感兴趣的文章
    NIO同步网络编程
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NIO笔记---上
    查看>>
    NIO蔚来 面试——IP地址你了解多少?
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NISP国家信息安全水平考试,收藏这一篇就够了
    查看>>
    NIS服务器的配置过程
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NiuShop开源商城系统 SQL注入漏洞复现
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP度量指标BELU真的完美么?
    查看>>