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

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

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


10、字符串统计聚合 string_stats

 

属于多值度量聚合,可用于计算统计聚合文档指定字段的字符串值的信息。字符串统计聚合包括:

 

l count 该字段非空的字符串数量

l min_length 最短的字符串长度

l max_length 最长的字符串长度


l avg_length 字符串的平均长度

l entropy 信息熵,量化了字段中包含的信息量,可用于度量数据集的广泛属性,如:多样性、相似性、随机性等

 

1)基础用法

 

POST /order/_search?size=0
{
  "aggs" : {
        "product_string_stats" : {
            "string_stats" : {
                "field" : "product_name"
            }
        }
    }
}

输出结果:

{
    ...
  "aggregations" : {
    "product_string_stats" : {
      "count" : 10,
      "min_length" : 6,
      "max_length" : 8,
      "avg_length" : 7.0,
      "entropy" : 3.469936429011566
    }
  }
}

在上述结果的基础上,我们向聚合文档中新增以下几个数据,并在添加完后立即执行 string_

stats:

PUT _bulk
{"index":{"_index":"order","_id":11}}
{"sales_name" : "Magi","product_name" : null,"brand" : "未知","count" : 2,"price" : 100,"order_time" : "2021-08-02"}
{"index":{"_index":"order","_id":12}}
{"sales_name" : "Magi","brand" : "未知","count" : 2,"price" : 100,"order_time" : "2021-08-02"}
{"index":{"_index":"order","_id":13}}
{"sales_name" : "Magi","product_name" : "","brand" : "未知","count" : 2,"price" : 100,"order_time" : "2021-08-02"

当前两条数据添加成功后,查看结果并未发生变化,当最后一条数据添加成功后,结果如下:

{
  ...
  "aggregations" : {
    "product_string_stats" : {
      "count" : 11,
      "min_length" : 6,
      "max_length" : 8,
      "avg_length" : 6.363636363636363,
      "entropy" : 3.469936429011566
    }
  }
}

结果中的 count 和 avg_length 均发生了变化,也就是说空字符串会参与到 count 和avg_length 的计算中,其中 count 增加,avg_length 变小。


2)字符串分布

 

信息熵的计算是基于数据集字段中每个字符出现的概率,要想查看字符的概率分布,可以使用 show_distribution 参数,默认该值为 false。


POST /order/_search?size=0
{
  "aggs" : {
        "product_string_stats" : {
            "string_stats" : {
                "field" : "product_name",
                "show_distribution" : true
            }
        }
    }
}

返回结果:


{
  ...
  "aggregations" : {
    "product_string_stats" : {
      "count" : 11,
      "min_length" : 6,
      "max_length" : 8,
      "avg_length" : 6.363636363636363,
      "entropy" : 3.469936429011566,
      "distribution" : {
        "1" : 0.2,
        "e" : 0.14285714285714285,
        "a" : 0.07142857142857142,
        "h" : 0.07142857142857142,
        "i" : 0.07142857142857142,
        "m" : 0.07142857142857142,
        "n" : 0.07142857142857142,
        "o" : 0.07142857142857142,
        "p" : 0.07142857142857142,
        "t" : 0.07142857142857142,
        "2" : 0.04285714285714286,
        "0" : 0.02857142857142857,
        "3" : 0.014285714285714285
      }
    }
  }
}

由上述结果可以看出,返回的字符排序是按照字符出现的概率降序排列的。

 

3)缺失值

 

默认情况下,对于文档中统计字段中缺失值的情况下,这部分文档会被自动忽略掉,我们可以通过参数 missing 指定值,以下例子将对于 price 字段没有值的文档,默认按照 unknown 进行处理:

 

POST /order/_search?size=0
{
  "aggs" : {
        "product_string_stats" : {
            "string_stats" : {
                "field" : "product_name",
                "missing" : "unknown"
            }
        }
    }
}

4)脚本

 

将产品名和品牌组合后再进行聚合统计:

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


11、普通脚本聚合


ES 默认使用 painless 脚本,基本用法:


"aggs" : {
    "<aggs_name>" : {
        "<aggs_type>" : {
            "script" : "<todo...>"
    859         >   三、产品能力
        }
    }
}

 l aggs_name:自定义聚合名

l aggs_type:聚合类型

l todo:脚本处理的逻辑

 

通过脚本聚合获取销售名为 Andy 的销售数量:


GET order/_search?size=0
{
    "aggs" : {
        "sum_count" : {
            "sum": {
                "script": "doc.sales_name.value == 'Andy' ? doc['count'].value :0"
            }
        }
    }
}

12、脚本聚合scripted_metric

 

使用脚本进行度量聚合的输出,基础语法:


GET order/_search?size=0
{
  "query": {
    "match_all": {}
  },
  "aggs": {
"profit": {
      "scripted_metric": {
        "init_script": "<todo...>", 
        "map_script": "<todo...>",
        "combine_script": "<todo...>",
        "reduce_script": "<todo...>"
      }
    }
  }
}

1)脚本的范围

 

l init_script

l 初始化脚本,可用于在 state 对象中定义初始化全局变量(比如一个数组),在后续的 map_script 中处理的结果将被存放在该变量结构中。脚本对象的类型仅支持 string,map,array。

 

l map_script

l 该参数为必须的,定义了获取数据的规则,对分片上的每条数据执行。在未指定 combine_script 时,则结果状态需要存储在 state 对象中。

 

l combine_script

l 该参数为必须的,根据匹配出来的文档结果按照一定的规则进行组合后确定最后需要返回的数据。

 

l reduce_script

l 该参数为必须的,在每个分片上,根据 combine_script 中返回的数据结果(该结果以数组的方式存储在变量 states 中)进行汇总,作为最后的结果输出。

 

举例:


l init_script 定义数组变量 orders

l map_script 将品牌名为 “ABC” 的价格计入 orders 变量中

l combine_script 对分片的结果乘以0.8后加和汇总

l reduce_script 将所有分片的结果加和输出


GET order/_search?size=0
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "discount_price": {
      "scripted_metric": {
        "init_script": "state.orders = []", 
        "map_script": "state.orders.add(doc.brand.value == 'Apple' ? doc.price.value :0)",
        "combine_script": "double price = 0; for (t in state.orders) { price += t*0.8 } return price",
        "reduce_script": "double price = 0; for (a in states) { price += a } return price"
      }
    }
  }
}


返回结果:


{
  ...
  "aggregations" : {
    "discount_price" : {
      "value" : 34841.064000000006
}
    862         >   三、产品能力
  }
}

以上脚本的执行过程可参考下图:


image.png

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

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
Kubernetes Cloud Native 关系型数据库
使用Zadig从0到1搭建持续交付平台(上)
使用Zadig从0到1搭建持续交付平台
使用Zadig从0到1搭建持续交付平台(上)
|
6月前
|
网络协议 API 网络安全
VMware NSX 9.0.1.0 发布 - 下一代网络安全虚拟化平台
VMware NSX 9.0.1.0 发布 - 下一代网络安全虚拟化平台
888 3
VMware NSX 9.0.1.0 发布 - 下一代网络安全虚拟化平台
|
7月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
497 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
前端开发 JavaScript vr&ar
WebGL
WebGL(Web Graphics Library)是一种用于在网页上渲染交互式 3D 和 2D 图形的 JavaScript API,它基于 OpenGL ES 2.0 标准,为开发者提供了一种在浏览器中创建高性能图形应用的途径
|
8月前
|
机器学习/深度学习 分布式计算 Java
Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害模拟与预警中的应用进展(213)
本文系统阐述基于Java的大数据分布式计算在气象灾害模拟与预警中的应用,涵盖数据采集、模型构建、案例实践与安全方案,为气象防灾减灾提供技术指南。
|
10月前
|
自然语言处理 API 区块链
电商API未来航向:智能化、开放性及新兴技术融合新蓝海
电商API作为连接电商平台与各方的核心纽带,其未来发展方向将深刻影响行业生态。文章从智能化升级、集成化拓展、开放性增强及新兴技术融合四个方面展开探讨。智能化升级通过AI实现精准服务与自动化流程;集成化拓展打破数据孤岛,促进全链路协同;开放性增强推动行业标准化与创新合作;新兴技术如大数据、区块链和元宇宙则开拓新场景。这些趋势将重塑电商服务体验,提升效率与个性化水平,推动行业迈向智能化与生态化新时代。电商企业需积极拥抱变化,以技术创新应对未来挑战。
|
11月前
|
缓存 并行计算 算法
《突破极限:用Python量化技术将700B参数MoE模型塞进消费级显卡》
通过量化技术,700B参数的混合专家模型(MoE)可从2.8TB显存压缩至18GB,适配单张RTX 4090显卡运行。这一突破基于三重策略:移除无效参数、分层量化与显存优化。测试显示,量化后模型在Llama 3 MoE架构上保持高性能,显存占用显著降低,推理速度媲美云端A100集群,精度仅下降1.2%。未来方向包括1-bit量化、光追加速及生物启发压缩,推动消费级硬件运行万亿参数模型的可能性。
523 1
|
机器学习/深度学习 人工智能 开发框架
《破局之路:跨学科协作研发AI项目的技术与理解破壁》
在AI项目研发中,跨学科协作至关重要,但也面临技术壁垒和理解差异的挑战。不同学科如计算机科学、数学、心理学等各具专长,但工具与术语的差异导致沟通障碍。为解决这些问题,需建立知识共享平台、制定通用沟通规范,并培养复合型人才。通过共同努力,打破壁垒,推动AI技术创新,助力社会发展。
420 14
|
人工智能 算法 数据可视化
分享5款好用有趣的小软件
本文分享5款宝藏级软件:学术笔记工具Zettlr,支持Markdown与LaTeX排版;文件清理专家DuplicateCleaner,精准定位重复文件;全能在线工具箱3171.cn,集视频、音频、图片处理等功能于一体;免费PPT模板资源平台优品PPT,助力高效演示;开源绘图软件Krita,适合插画、漫画创作。这些软件功能强大但可能鲜为人知,值得尝试!
282 0

热门文章

最新文章