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

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

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


4、和聚合 sum

 

和聚合属于单值度量聚合,可从聚合文档中的数值字段或者直方图字段中计算出总和。

 

1)基础用法

 

获取订单中产品的总销量,并定义总销量字段为 count_sum ,该字段也将作为结果返回:


POST /order/_search?size=0
{
  "aggs" : {
        "count_sum" : {
            "sum" : {
                "field" : "count"
            }
        }
    }
}


返回结果:


{
  ...
  "aggregations" : {
    "count_sum" : {
      "value" : 179
}
  }
}

2)缺失值

 

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

 

POST /order/_search?size=0
{
  "aggs" : {
        "count_sum" : {
            "sum" : {
                "field" : "count",
                "missing": 1
            }
        }
    }
}

3)Histogram fields

 

在直方图字段上计算和聚合,计算的方法为将文档数组中的 value 乘以对应位置的 count 后进行加和汇总。

 

以存储不同网络的预聚合直方图和延迟度量的索引为例(数据参见 平均值聚合avg 第3点):

POST /metrics_index/_search?size=0
{
  "aggs" : {
"total_latency" : { 
      "sum" : { 
        "field" : "latency_histo" 
        } 
      }
    }
}


计算 latency_histo 字段和聚合的方法为,将每个文档的 value 乘以对应位置的 count 后再计算总和,因此上述结果为:


{
  ...
  "aggregations": {
    "sum_latency": {
      "value": 28.8
    }
  }
}

4)脚本


GET order/_search?size=0
{
  "runtime_mappings": {
    "price.weighted": {
      "type": "double",
      "script": """
        double price = doc['price'].value;
        if (doc['price'].value > 20000) {
          price *= 0.8;
        }
        emit(price);
      """
    }
  },
  "aggs": {
    "sum_price": {
      "sum": {
        "field": "price.weighted"
      }
    }
  }
}

5、去重聚合 cardinality

 

去重聚合属于单值度量聚合,用于计算文档中不同值的数量,这个结果会是一个接近真实的值。

 

1)基础用法

 

获取订单数据中的销售产品的品牌数量,定义销售产品品牌数量的名字为 brand_count ,该字段也将作为结果返回:

POST /order/_search?size=0
{
    "aggs" : {
        "brand_count" : {
            "cardinality" : {
                "field" : "brand"
            }
        }
    }
}

返回结果:

{
  ...
  "aggregations" : {
    "btand_count" : {
      "value" : 2
    }
  }
}

2)缺失值

 

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

 

增加一条品牌为空的数据:

post _bulk
{"index":{"_index":"order","_id":8}}
{"sales_name":"Amy","product_name":"mate11","price":"5387.23","count":28,"order_time":"2021-06-11"}

计算聚合:

POST /order/_search?size=0
{
    "aggs" : {
        "brand_count" : {
            "cardinality" : {
                "field" : "brand",
                "missing": "N/a"
            }
        }
    }
}

输出结果:


{
  ...
  "aggregations" : {
    "brand_count" : {
      "value" : 3
    }
  }
}


3)精度控制

 

可以使用 precision_threshold 参数定义阈值进行精度控制,使用方法如下:

POST /order/_search?size=0
{
    "aggs" : {
        "brand_count" : {
            "cardinality" : {
                "field" : "brand",
                "precision_threshold" : 100
            }
        }
    }
}

以上述品牌数量为例,该参数定义的阈值意义是:当品牌的去重数量在 100 以内,那么去重返回的结果精度可以接近100%。也就是当聚合文档中去重字段数量小于 precision_threshold 定义的阈值时,预期返回的结果将接近准确值,如果高于这个阈值,那么预期返回的结果将变的不再准确。precision_threshold 支持的最大值是40000,高于这个数的阈值将具有与阈值40000相同的效果,默认值为3000。

 

去重聚合的计算基于 HyperLogLog++ (HLL)算法,获取字段的哈希值,通过哈希值的相似度来计算数量。当聚合文档过大,或者计算的去重字段值太大都会需要消耗更多的内存。对于 precision_threshold 阈值为 n 的精度控制,在执行时将消耗 n*8 bytes 的内存。因此当阈值越大,占用的内存也会越大。但当阈值低至100时,即使计算的数据集有百万条,误差仍然很低。

 

哈希运算在数字字段上执行的非常快,存储原始数值与存储哈希所需的内存基本相同或者更少。因此我们可对字符串类型的字段进行预计算,从而提高运算速度。在 ES 中可以使用 mapper-murmur3 的插件提前将字段值的哈希值存储在索引中,这样在运行聚合时会更快。这种预计算哈希值的场景,应用在非常大的数据集或者非常大的字段上效果比较明显,可以节省 CPU 和内存。当然在较小的字符串字段,也可以应用进行性能优化。

 4)脚本

 

需要将多个字段组合进行聚合计算的,可以使用脚本来处理:

 

GET order/_search?size=0
{
  "runtime_mappings": {
    "product_and_brand": {
      "type": "keyword",
      "script": "emit(doc['product_name'].value + ' ' + doc['brand'].value)"
    }
  },
  "aggs": {
    "product_brand_count": {
      "cardinality": {
        "field": "product_and_brand"
      }
    }
  }
}


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

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
安全 物联网 物联网安全
带你读《工业物联网安全》之二:工业物联网数据流和安全架构
本书为读者提供了针对IIoT安全各个方面的综合理解,以及用来构建部署安全IIoT解决方案的实践技术。书中介绍IIoT安全的基本原则、威胁模型、参考架构,以及现实生活中的实例分析学习,涵盖了用来设计基于风险安全控制方案的各种实用工具,并且深入讨论了多层防御相关技术,包括IAM、终端安全、互联技术以及基于边界和云环境的应用。读者能够从本书中获得保护IIoT生命周期流程、标准化、治理与评估新兴技术适用性方面的实用经验,从而实现成规模、可靠且具有社会效益的互联系统。
|
UED
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。
376 67
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
|
7月前
|
人工智能 搜索推荐 算法
PDF 转 JPG 图片小工具:CodeBuddy 助力解决转换痛点
在 PDF 转 JPG 的实际应用中,用户普遍面临转换质量差、批量处理效率低、格式兼容性不足以及编程实现困难等痛点。而 CodeBuddy 凭借智能代码生成与优化、实时错误诊断修复、助力代码学习拓展,以及支持多场景适配与个性化定制等强大的 AI 编程能力,精准直击这些难题。使用 CodeBuddy 开发 Python PDF 转 JPG 小工具,能够有效提升转换效率与质量,降低开发门槛和成本,为用户带来高效、优质的文件格式转换体验。
268 16
|
Java Shell Nacos
升级Nacos竟然踩了这种坑?配置文件里的“隐形杀手”!
本文介绍了从Nacos 1.3.0升级到2.3.0的过程及注意事项,涵盖单机与集群模式的升级步骤,特别分享了一次因配置文件中多余空格导致的服务启动失败的经历,提醒读者注意配置细节。
487 0
|
11月前
|
机器学习/深度学习 人工智能 并行计算
Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈
Titans 是谷歌推出的新型神经网络架构,通过神经长期记忆模块突破 Transformer 在处理长序列数据时的瓶颈,支持并行计算,显著提升训练效率。
421 5
Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈
|
存储 SQL Cloud Native
Hologres 的架构设计与工作原理
【9月更文第1天】随着大数据时代的到来,实时分析和处理数据的需求日益增长。传统的数据仓库在处理大规模实时数据分析时逐渐显露出性能瓶颈。为了解决这些问题,阿里巴巴集团研发了一款名为 Hologres 的新型云原生交互式分析数据库。Hologres 能够支持 SQL 查询,并且能够实现实时的数据写入和查询,这使得它成为处理大规模实时数据的理想选择。
558 2
ly~
|
Ubuntu Linux C语言
SDL 图形库安装常见错误及解决方法
SDL(Simple DirectMedia Layer)图形库安装过程中可能会遇到编译错误、运行时错误、依赖库缺失等问题。本文总结了在 Linux 和 Windows 系统上常见的错误及解决方法,包括检查和安装依赖库、配置 SDL 子系统、处理 X11 错误等,帮助用户顺利完成 SDL 的安装和配置。
ly~
2624 8
|
云安全 弹性计算 安全
带你读《阿里云安全白皮书》(六)—— 公共云安全治理框架
《阿里云安全白皮书(2024版)》介绍了阿里云在云上安全治理框架的设计与建设,涵盖安全机制保障、安全能力支撑、数据主权保护、身份管控与授权、安全防护能力弹性扩展、快速响应与恢复、安全高可用及合规支撑等方面,旨在帮助客户以更低的成本实现更高的安全性。
|
机器学习/深度学习 存储 人工智能
AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
【9月更文挑战第1天】AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
|
存储 自然语言处理 机器人
ROS2教程06 ROS2行动
这篇文章是关于ROS2(Robot Operating System 2)行动(Action)通信机制的教程,包括行动的概念、特点、命令行工具的使用,以及如何编写行动的客户端和服务器代码,并介绍了如何测试行动通信。
554 4
ROS2教程06 ROS2行动

热门文章

最新文章