带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(6)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之40:——3.4.2.21.Aggregations(6)


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(5) https://developer.aliyun.com/article/1229239


7、百分比聚合 percentiles

 

首先简单介绍下百分位数,我们称位于 n% 位置的值称为第 n 百分位数。它的计算方式如下:

 

l 将一组数据 data 从小到大排序(该数据的数量为m)

l 计算第 n 百分位数所在位置 p :p = 1 + (m - 1) * n%

l 计算第 n 百分位数的值 x,得到位置 p 所在数据组中的数据左右相邻的数值 data[p-1] 和 data[p+1] ,则 x = data[p-1] + (data[p+1] - data[p-1])*(p - p向下取整的整数)。


image.png

以上图的数据为例,我们来计算第80位百分数。

 

l 计算位置:p = 1 + (12 -1)*0.8 = 9.8

l 计算值:x = 8999.65 + (9759.25 - 8999.65) * (9.8 - 9) = 9607.330

 

不同的应用程序百分位数的计算方式会有略微的差异,但不影响我们对百分位数的应用,比如找出数据中异常等。

 

ES 的百分比聚合可以从文档中数值类型的字段中提取一个或多个百分位数,默认情况下会按照 [ 1, 5, 25, 50, 75, 95, 99 ] 进行返回。

 

1)基础用法


{
  "aggs" : {
        "{percentiles_name}" : {
            "percentiles" : {
                "field" : "{percentiles_field_name}" ,
                "percents" : "[{percent1},{percent2},...]",
                "keyed" : "{true/false}"
            }
        }
    }
}

l percentiles_name 自定义 percentiles 的名称

l percentiles_field_name 参与计算的字段名

l percents 指定返回的百分比数值

l keyed 返回格式按照{key:value}的方式返回,而非数组 {key:xxx,value:xxx} ,默认为true

 

获取产品销售价格的百分数:

 

POST /order/_search?size=0
{
  "aggs" : {
        "price_percentiles" : {
            "percentiles" : {
                "field" : "price" 
            }
        }
    }
}

 返回结果:


{
  ...
  "aggregations" : {
    "price_percentiles" : {
      "values" : {
        "1.0" : 100.0,
    842         >   三、产品能力
        "5.0" : 100.0,
        "25.0" : 3974.73,
        "50.0" : 8176.825000000001,
        "75.0" : 9379.45,
        "95.0" : 9996.914,
        "99.0" : 9999.2
      }
    }
  }
}

 获取产品销售价格的百分数,并指定百分数 [10,80,90] :

POST /order/_search?size=0
{
  "aggs" : {
        "price_percentiles" : {
            "percentiles" : {
                "field" : "price" ,
                "percents" : [10, 80, 90]
            }
        }
    }
}


返回结果:


  ...
  "aggregations" : {
    "price_percentiles" : {
      "values" : {
        "10.0" : 100.0,
        "80.0" : 9780.959,
        "90.0" : 9983.198
      }
    }
  }
}

使用数组方式返回结果:


POST /order/_search?size=0
{
  "aggs" : {
        "price_percentiles" : {
            "percentiles" : {
                "field" : "price" ,
                "percents" : [10, 80, 90],
                "keyed": false
            }
        }
    }
}

返回结果:


{
  ...
  "aggregations" : {
    "price_percentiles" : {
      "values" : [
        {
          "key" : 10.0,
          "value" : 100.0
        },
        {
          "key" : 80.0,
          "value" : 9780.959
        },
        {
          "key" : 90.0,
          "value" : 9983.198
        }
      ]
    }
  }
}

2)缺失值

 

默认情况下,当文档中缺失计算字段值时,该文档将会被忽略,若我们希望使用这部分文档,可以通过设置 missing 参数。以下例子中,缺失字段的 price 将按照 0 来计算。


POST /order/_search?size=0
{
  "aggs" : {
        "price_percentiles" : {
            "percentiles" : {
                "field" : "price" ,
        "missing" : 0
            }
        }
    }
}

3)精确度

 

百分位度量使用 TDigest 近似算法来计算,该算法具有以下几个特性:

 

l 百分位的准确度与百分位的位置极端程度成正比,也就是位于始末的1 或 99 的百分位要比中间位置的要更准确

l 数据集越小,百分位数的准确度越高;当数据集较小时,可达到100%准确

l 随着数据集的增长,算法开始对百分位进行估算。根据聚合数据的分布及数据量的大小,可以有效的在准确度和节省内存之间作出权衡

 

需要注意的是,在实时性、精确度、数据量三个特性中,我们最多只能满足两个,而近似算法选择了实时性和大数据量,所以会损失一定的精确度,提供相对准确的分析结果。

 

4)压缩

 

压缩参数 compression 可以帮助近似算法(tdigest)平衡内存的使用和精度的估算。


POST /order/_search?size=0
{
  "aggs" : {
        "price_percentiles" : {
            "percentiles" : {
                "field" : "price" ,
        "tdigest": {
                  "compression": 200    
                }
            }
        }
    }
}

TDigest 算法使用多个节点来执行百分位的计算,使用的节点越多,占用的内存越大,计算的结果越精确。设置该参数后,节点数量限制为最多 20 * compression,默认值为100,也就是

20 * 100 = 2000 个节点。每个节点大约占用32字节的内存,那么在最糟糕的情况下(大量的数据依次到达) 2000个节点就占用 64KB。实际上,数据往往更随机,而 TDigest 将使用更少的内存。

 

5)HDR 直方图

 

HDR直方图(High Dynamic Range Histogram,高动态范围直方图)是一种替代实现,在计算延迟度量的百分位数时非常有用,因为它比 t-digest 实现更快,但需要更大的内存占用。此实现维护一个固定的最坏情况百分比错误。这意味着如果数据记录值从1微秒到1小时(3600000000毫秒)直方图设置为3位有效数字,它将维持一个价值1微秒的分辨率值1毫秒,3.6秒(或更好的)最大跟踪值(1小时)。

 

GET /order/_search?size=0
{
  "size": 0,
  "aggs": {
    "price_percentiles": {
      "percentiles": {
        "field": "price",
        "percents": [ 95, 99, 99.9 ],
        "hdr": {                                  
          "number_of_significant_value_digits": 3 
        }
      }
    }
  }
}

l hdr 指定直方图相关的参数

l number_of_significant_value_digits 指定以有效位数为单位的直方图值的分辨率

 

注意:hdr直方图只支持正值,如果传递负值,则会出错。如果值的范围是未知的,那么使用HDRHistogram也不是一个好主意,因为这可能会导致内存的大量使用。


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(7) https://developer.aliyun.com/article/1229235

 

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
XML Java 数据库
Flowable入门程序——构建一个命令行程序(一)
Flowable入门程序——构建一个命令行程序
366 0
|
7月前
|
人工智能 自然语言处理 搜索推荐
AI 搜索开放平台重磅发布:Qwen3 模型上线啦
阿里云AI搜索开放平台重磅发布最新Qwen3模型,为企业和开发者提供全栈智能搜索解决方案。Qwen3作为最新一代大模型,在推理、多语言支持和Agent能力上表现卓越。用户可通过三步快速体验Qwen3服务,助力业务在AI时代抢占先机。
946 13
|
4月前
|
人工智能 Cloud Native 数据管理
海外上新|阿里云瑶池全新发布AI数据准备能力,显著降低AI开发门槛
2025阿里云国际峰会在新加坡举行,宣布设立首个AI全球能力中心,并推出多款云与AI产品,加速技术国际化。会上展示瑶池数据库全面升级,集成Data+AI能力,助力企业智能转型。
|
5月前
|
自然语言处理 数据可视化 API
解锁 Qwen3 的Agent能力,CookBook来咯!
Qwen3系列模型具备强大Agent能力,但从模型到Agent仍存技术难题。为此,我们推出基于Qwen-Agent框架的3个CookBook示例,展示如何让Qwen3丝滑调用MCP Server全过程。不论是本地部署还是API调用模型,开发者均可通过Qwen-Agent完成复杂任务。CookBook包括自然语言驱动数据库操作、云端高德API地理服务及文档转思维导图等功能。Qwen-Agent封装了工具调用模板和解析器,原生支持MCP协议,大幅降低开发成本。欢迎体验并反馈。
648 1
|
监控 算法 Java
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Gauge和Histogram篇)
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Gauge和Histogram篇)
243 0
|
安全 Java 应用服务中间件
避免Tomcat调试信息泄露的最佳实践
小米分享了团队解决网站敏感信息泄露问题的经历。在处理运行时错误时,Tomcat显示的调试信息可能泄露。尝试过使用Spring Boot的`ErrorAttributes`接口和修改Tomcat默认错误页面均未成功。最终,他们通过自定义错误页面并配置`application.yml`来隐藏敏感信息,成功解决了问题。这个方法推荐给其他开发者作为避免调试信息泄露的安全实践。
163 3
避免Tomcat调试信息泄露的最佳实践
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
814 14
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
搜索推荐 API
LangChain-16 Using Tools LangChain封装好的工具集tools
LangChain-16 Using Tools LangChain封装好的工具集tools
194 5
|
前端开发 JavaScript 数据库
https页面加载http资源的解决方法
https页面加载http资源的解决方法
751 7