带你读《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并实现搜索。  
相关文章
|
5月前
|
弹性计算
如何查询自己的阿里云账户是新用户还是老用户?
阿里云新用户指无任何收费云产品购买记录的实名认证用户(含试用未付费者);老用户则已有付费订单。同一证件下多账号共享唯一新用户资格。本文详解判定标准与自查步骤,助力大家精准锁定优惠权益。
672 9
|
人工智能 文字识别 异构计算
SmolDocling:256M多模态小模型秒转文档!开源OCR效率提升10倍
SmolDocling 是一款轻量级的多模态文档处理模型,能够将图像文档高效转换为结构化文本,支持文本、公式、图表等多种元素识别,适用于学术论文、技术报告等多类型文档。
1395 1
SmolDocling:256M多模态小模型秒转文档!开源OCR效率提升10倍
|
机器学习/深度学习 文字识别 自然语言处理
OCR技术:数字化办公的“隐形助手”
在数字化办公时代,OCR(光学字符识别)技术如同一位“隐形助手”,将纸质文档转化为可编辑的电子文本,大幅提升工作效率与准确性。它不仅革新了文档处理方式,还通过智能化应用实现票据识别、客户信息录入等功能,助力财务和CRM系统自动化。此外,OCR技术能挖掘文档数据价值,支持决策分析,并可通过个性化定制满足跨语言协作或内容搜索等需求。开发者可结合自然语言处理、机器学习等技术,探索更多创新应用场景,如智能文档管理和内容可视化工具。OCR技术正以高效、智能的方式,推动办公流程全面升级,激发无限可能。
691 57
|
数据可视化 前端开发 数据挖掘
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
本文介绍了一个基于Python Flask框架的广州历史天气数据应用与可视化大屏系统,该系统通过数据采集、处理、分析和可视化技术,提供了丰富的气象数据展示和决策支持,帮助用户快速了解和应对气象变化。
873 110
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
|
Java 开发者
Java一分钟之-JavaFX布局管理:GridPane, VBox, HBox
本文介绍了JavaFX的三种常用布局管理器:GridPane、VBox和HBox。GridPane用于创建二维网格布局,需设置行和列约束以防止控件重叠。VBox按垂直方向堆叠控件,记得设置间距。HBox水平排列控件,可能需要分配额外空间以避免水平滚动条。示例代码展示了这三种布局的使用。理解并运用这些布局管理器能提升JavaFX应用的界面设计。
884 0
|
安全 应用服务中间件 网络安全
Kali测试:散列密码破解(二)
Kali渗透测试:散列密码破解(二)
441 1
|
索引 Python
如何高效地对比处理 DataFrame 的两列数据
如何高效地对比处理 DataFrame 的两列数据
431 0
|
存储 SQL 关系型数据库
15. Mysql 变量的使用
15. Mysql 变量的使用
440 2
|
存储 数据可视化 数据库
构建简易个人记账应用
【8月更文挑战第31天】在这个数字化时代,掌握资金流动对于个人理财至关重要。本文将引导你使用Python和SQLite数据库构建一个简易的个人记账应用。我们将从基础的数据模型设计开始,逐步实现数据的增删查改功能,并探讨如何通过用户界面与后端代码交互。文章末尾,我们会讨论可能的扩展功能,以增强这个应用的实用性。无论你是编程新手还是想实践项目经验的开发者,这篇文章都将为你提供有价值的指导。

热门文章

最新文章