带你读《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并实现搜索。  
相关文章
|
UED
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。
454 67
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
|
Java Shell Nacos
升级Nacos竟然踩了这种坑?配置文件里的“隐形杀手”!
本文介绍了从Nacos 1.3.0升级到2.3.0的过程及注意事项,涵盖单机与集群模式的升级步骤,特别分享了一次因配置文件中多余空格导致的服务启动失败的经历,提醒读者注意配置细节。
632 0
|
机器学习/深度学习 人工智能 并行计算
Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈
Titans 是谷歌推出的新型神经网络架构,通过神经长期记忆模块突破 Transformer 在处理长序列数据时的瓶颈,支持并行计算,显著提升训练效率。
641 5
Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈
|
机器学习/深度学习 存储 人工智能
AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
【9月更文挑战第1天】AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出
|
云安全 弹性计算 安全
带你读《阿里云安全白皮书》(六)—— 公共云安全治理框架
《阿里云安全白皮书(2024版)》介绍了阿里云在云上安全治理框架的设计与建设,涵盖安全机制保障、安全能力支撑、数据主权保护、身份管控与授权、安全防护能力弹性扩展、快速响应与恢复、安全高可用及合规支撑等方面,旨在帮助客户以更低的成本实现更高的安全性。
|
安全
C 空指针的使用注意点
在 C 语言中,空指针(NULL pointer)是指不指向任何有效地址的指针。使用时需注意以下几点:1. 初始化指针,如 `int *ptr = NULL;` 2. 解引用前检查有效性,如 `if (ptr != NULL)` 3. 函数参数中处理空指针 4. 用作标识值 5. 检查动态内存分配结果 6. 释放内存后设为 `NULL` 7. 多级指针需逐层检查 8. 谨慎赋值空指针。空指针是强大的工具,但需谨慎使用以确保程序安全稳定。
505 12
|
传感器 人工智能 自动驾驶
智能交通系统:自动驾驶技术的社会影响
【9月更文挑战第27天】随着科技发展,智能交通系统与自动驾驶技术正革新交通领域,从提高交通效率与安全性到优化资源分配,其影响深远。自动驾驶技术基于AI与传感器,历经五个等级演进,促进交通流畅的同时减少人为驾驶错误。然而,技术进步亦引发就业市场变化、数据隐私及道德责任等问题,城市规划需适应新技术,加建充电站等设施。尽管存在挑战,智能交通系统仍有望重塑城市面貌,提升出行体验,实现更高效、环保的城市交通体系。
|
存储 前端开发 Java
Java中的不同Bean作用域
【7月更文挑战第5天】
359 0
Java中的不同Bean作用域
|
Ubuntu Linux C语言
【opencv】opencv在windows和linux的应用
【opencv】opencv在windows和linux的应用
|
设计模式 监控 Java
深入理解Spring Cloud中的断路器模式
深入理解Spring Cloud中的断路器模式

热门文章

最新文章

下一篇
开通oss服务