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

简介: 带你读《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入门程序——构建一个命令行程序
498 0
|
机器学习/深度学习 算法
【数学建模竞赛】评价类赛题常用算法解析
【数学建模竞赛】评价类赛题常用算法解析
662 0
|
存储 搜索推荐 数据挖掘
使用selenium库模拟浏览器行为,获取网页的cookie值
使用selenium库模拟浏览器行为,获取网页的cookie值
|
27天前
|
弹性计算
如何查询自己的阿里云账户是新用户还是老用户?
阿里云新用户指无任何收费云产品购买记录的实名认证用户(含试用未付费者);老用户则已有付费订单。同一证件下多账号共享唯一新用户资格。本文详解判定标准与自查步骤,助力大家精准锁定优惠权益。
194 9
|
16天前
|
传感器 数据采集 人工智能
AI+数字孪生:从实时映射到智能决策的技术架构与实践路径
当数字孪生遇上AI,物理世界拥有了“预演未来”的能力。2026年,“可执行数字孪生”兴起——凡拓数创自研AI 3D引擎支持多物理场仿真与千万次并行训练,已在机器人Sim2Real迁移、工业预测性维护等场景落地见效。
|
6月前
|
人工智能 编解码 监控
《AV1解码生态全景图》,迄今最全面的AV1解码生态报告
截至2025年11月最完整详尽的 AV1 解码生态全景报告
|
数据可视化 前端开发 数据挖掘
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
本文介绍了一个基于Python Flask框架的广州历史天气数据应用与可视化大屏系统,该系统通过数据采集、处理、分析和可视化技术,提供了丰富的气象数据展示和决策支持,帮助用户快速了解和应对气象变化。
758 110
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
|
安全 Java 应用服务中间件
避免Tomcat调试信息泄露的最佳实践
小米分享了团队解决网站敏感信息泄露问题的经历。在处理运行时错误时,Tomcat显示的调试信息可能泄露。尝试过使用Spring Boot的`ErrorAttributes`接口和修改Tomcat默认错误页面均未成功。最终,他们通过自定义错误页面并配置`application.yml`来隐藏敏感信息,成功解决了问题。这个方法推荐给其他开发者作为避免调试信息泄露的安全实践。
265 3
避免Tomcat调试信息泄露的最佳实践
|
缓存 Java 开发者
Spring高手之路22——AOP切面类的封装与解析
本篇文章深入解析了Spring AOP的工作机制,包括Advisor和TargetSource的构建与作用。通过详尽的源码分析和实际案例,帮助开发者全面理解AOP的核心技术,提升在实际项目中的应用能力。
433 0
Spring高手之路22——AOP切面类的封装与解析
|
网络协议 网络架构
IETF:名词历史简介互联网精神的典范
IETF:名词历史简介互联网精神的典范
418 0

热门文章

最新文章