带你读《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;
相关文章
|
9月前
|
数据采集 人工智能 算法
美团 LongCat 团队发布全模态一站式评测基准UNO-Bench:揭示单模态与全模态能力的组合规律
美团LongCat团队推出一站式全模态大模型评测基准UNO-Bench,首创“组合定律”揭示多模态能力协同增益,支持中文场景,以98%跨模态问题占比和创新多步开放式题型,科学评估模型真实融合能力。
858 5
|
12月前
|
机器学习/深度学习 分布式计算 Java
Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害模拟与预警中的应用进展(213)
本文系统阐述基于Java的大数据分布式计算在气象灾害模拟与预警中的应用,涵盖数据采集、模型构建、案例实践与安全方案,为气象防灾减灾提供技术指南。
|
缓存 并行计算 算法
《突破极限:用Python量化技术将700B参数MoE模型塞进消费级显卡》
通过量化技术,700B参数的混合专家模型(MoE)可从2.8TB显存压缩至18GB,适配单张RTX 4090显卡运行。这一突破基于三重策略:移除无效参数、分层量化与显存优化。测试显示,量化后模型在Llama 3 MoE架构上保持高性能,显存占用显著降低,推理速度媲美云端A100集群,精度仅下降1.2%。未来方向包括1-bit量化、光追加速及生物启发压缩,推动消费级硬件运行万亿参数模型的可能性。
686 1
|
人工智能 算法 API
百川智能发布角色大模型 ,零代码复刻角色轻松满足游戏领域定制需求
百川智能于2024年1月9日推出Baichuan-NPC角色大模型,优化了角色知识和对话能力,提升游戏AI角色的真实感。同时,公司发布了零代码角色创建平台,允许游戏厂商通过简单描述快速定制角色,降低开发成本和提高效率。Baichuan-NPC通过大量针对性训练,解决了角色扮演的“非拟人化”问题,增强了角色一致性。此外,百川智能的角色创建平台结合搜索增强知识库,提供高自由度的角色定制,支持实时调优和一键代码复制,简化了开发流程,已获得创梦天地、完美世界游戏等合作伙伴的认可。
510 2
百川智能发布角色大模型 ,零代码复刻角色轻松满足游戏领域定制需求
|
存储 数据可视化 Java
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
如何在Linux系统下部署和运行Java项目jar包,包括传输文件到Linux、使用nohup命令运行jar包、查看端口状态、杀死进程和查看项目运行状态,以及如何解决“没有主清单属性”的错误。
3451 2
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
|
数据可视化 前端开发 Java
自动化测试框架的选择与实践: Selenium vs. TestComplete
【6月更文挑战第18天】在软件开发的海洋中,自动化测试是一艘能够确保产品质量和效率的坚固船只。本文将深入探讨两种流行的自动化测试框架——Selenium和TestComplete,从它们的优势、局限性到适用场景进行对比分析。我们将通过实际案例来揭示如何根据项目需求选择最合适的测试工具,并提供一些实用的实施建议。文章旨在为读者提供清晰的指导,帮助他们在自动化测试的旅程中做出明智的决定。
611 3
|
网络协议 安全 Linux
Linux中无法连接互联网或局域网
【10月更文挑战第5天】
3333 3
|
存储
计算机进制转换
计算机进制转换
1032 4
|
域名解析 网络协议 数据安全/隐私保护
TCP/IP配置
【10月更文挑战第20天】TCP/IP配置
970 1

热门文章

最新文章