ElasticSearch-聚合操作

  • 聚合的分类 aggs
  • Metric Aggregation
    • min, max, avg, sum
    • stats, cardinality
  • Bucket Aggregation
    • terms
      • order
      • text -> fielddata
      • range
      • histogram
      • top_hits
  • Pipeline Aggregation
    • min_bucket
    • stats_bucket
    • percentiles_bucket
    • cumulative_sum
  • 聚合的作用范围 Filter, Post Filter, Global
  • 排序 order
  • ES聚合分析不精准原因分析 shard_size

  • Elasticsearch除搜索以外,提供了针对ES 数据进行统计分析的功能
"aggs" : { # 和 query 同级的关键词"<aggregation_name>" : { # 自定义的聚合名字"<aggregation_type>" : { # 聚合的定义: 不同的 type+body<aggregation_body>}[,"meta" : { [<meta_data_body>] } ]?[,"aggregations" : { [<sub_aggregation>]+ } ]? # 子聚合查询}[,"<aggregation_name_2>" : { ... } ]* # 可以包含多个同级的聚合查询 
}

聚合的分类

  • Metric Aggregation:—些数学运算,可以对文档字段进行统计分析
    • {"aggs":{"avg_price":{"avg":{"field":"price"}}}}
  • Bucket Aggregation: 一些满足特定条件的文档的集合放置到一个桶里,每一个桶关联一个 key
    • {"aggs":{"by_size":{"terms":{"field":"size"}}}
  • Pipeline Aggregation:对其他的聚合结果进行二次聚合

Metric Aggregation

  • 单值分析︰只输出一个分析结果
    • min, max, avg, sum
    • Cardinality(对搜索结果去重)
  • 多值分析︰输出多个分析结果
    • stats(统计), extended stats
    • percentile (百分位), percentile rank
    • top hits (排在前面的示例)
    • cardinate 对搜索结果去重
# 多个 Metric 聚合,找到最低最高和平均工资
POST /employees/_search
{"size":0,"aggs":{"max_salary":{"max":{"field":"salary"}},"min_salary":{"min":{"field":"salary"}},"avg_salary":{"avg":{"field":"salary"}}}}
# 一个聚合,输出多值
POST /employees/_search 
{"size":0,"aggs":{"stats_salary":{"stats":{"field":"salary"}}}}
# cardinate 对搜索结果去重
POST /employees/_search 
{"size":0,"aggs":{"cardinate":{"cardinality":{"field":"job.keyword"}}}}

Bucket Aggregation

  • 按照一定的规则,将文档分配到不同的桶中,从而达到分类的目的
    • Terms,需要字段支持 filedata
    • keyword 默认支持 fielddata
    • text 需要在 Mapping 中开启 fielddata,会按照分词后的结果进行分桶
    • 数字类型
      • Range / Data Range
      • Histogram(直方图) / Date Histogram
    • 支持嵌套:也就在桶里再做分桶
# 对 keword 进行聚合
GET /employees/_search 
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword"}}}}
  • 聚合可配置属性有
    • field:指定聚合字段
    • size:指定聚合结果数量
    • order:指定聚合结果排序方式
  • 默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序
    • 可以指定order属性,自定义聚合的排序方式
GET /employees/_search
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword","size":10,"order":{"_count":"desc"}}}}}
  • 限定聚合范围
# 只对 salary 在 10000 元以上的文档聚合
GET /employees/_search 
{"query":{"range":{"salary":{"gte":10000}}},"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword","size":10,"order":{"_count":"desc"}}}}}
  • 对 Text 字段进行 terms 聚合查询,会失败抛出异常
    • 对 Text 字段打开 fielddata,支持terms aggregation
PUT /employees/_mapping 
{"properties":{"job":{"type":"text","fielddata":true}}}
# 对 Text 字段进行分词,分词后的 terms 
POST /employees/_search
{"size":0,"aggs":{"jobs":{"terms":{"field":"job"}}}}
  • Range & Histogram 聚合
    • 按照数字的范围,进行分桶
    • 在 Range Aggregation 中,可以自定义 Key
  • Range 按区间分桶
# Salary Range 分桶,可以自己定义 key 
POST employees/_search
{"size":0,"aggs":{"salary_range":{"range":{"field":"salary","ranges":[{"to":10000},{"from":10000,"to":20000},{"key":">20000","from":20000}]}}}}
  • Histogram 按间隔分桶
# 工资 0 到 10 万,以 5000 一个区间进行分桶 
POST employees/_search
{"size":0,"aggs":{"salary_histrogram":{"histogram":{"field":"salary","interval":5000,"extended_bounds":{"min":0,"max":100000}}}}}
  • top_hits 应用场景:当获取分桶后,桶内最匹配的顶部文档列表
# 指定size,不同工种中,年纪最大的3个员工的具体信息 
POST /employees/_search
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword"},"aggs":{"old_employee":{"top_hits":{"size":3,"sort":[{"age":{"order":"desc"}}]}}}}}}
  • 嵌套聚合
# 嵌套聚合,按照工作类型分桶,并统计工资信息 
POST employees/_search
{"size":0,"aggs":{"Job_salary_stats":{"terms":{"field":"job.keyword"},"aggs":{"salary":{"stats":{"field":"salary"}}}}}}
# 多次嵌套,根据工作类型分桶,然后按照性别分桶,计算工资的统计信息 
POST employees/_search
{"size":0,"aggs":{"Job_gender_stats":{"terms":{"field":"job.keyword"},"aggs":{"gender_stats":{"terms":{"field":"gender"},"aggs":{"salary_stats":{"stats":{"field":"salary"}}}}}}}}

Pipeline Aggregation

  • 支持对聚合分析的结果,再次进行聚合分析
  • Pipeline 的分析结果会输出到原结果中,根据位置的不同,分为两类
    • Sibling - 结果和现有分析结果同级
      • Max,min,Avg & Sum Bucket
      • Stats,Extended Status Bucket
      • Percentiles Bucket
    • Parent - 结果内嵌到现有的聚合分析结果之中
      • Derivative (求导)
      • Cumultive Sum (累计求和)
      • Moving Function (移动平均值 )
  • 通过bucket_path关键字指定路径
  • min_bucket 之前结果的最小值
# 平均工资最低的工种
# min_salary_by_job 结果和 jobs 的聚合同级
POST employees/_search 
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword","size":10},"aggs":{"avg_salary":{"avg":{"field":"salary"}}}},"min_salary_by_job":{"min_bucket":{"buckets_path":"jobs>avg_salary"}}}}
  • Stats 统计分析
# 平均工资的统计分析
POST employees/_search
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword","size":10},"aggs":{"avg_salary":{"avg":{"field":"salary"}}}},"stats_salary_by_job":{"stats_bucket":{"buckets_path":"jobs>avg_salary"}}}}
  • percentiles 百分位数
# 平均工资的百分位数
POST employees/_search
{"size":0,"aggs":{"jobs":{"terms":{"field": "job.keyword","size":10},"aggs":{"avg_salary":{"avg":{"field":"salary"}}}},"percentiles_salary_by_job":{"percentiles_bucket":{"buckets_path":"jobs>avg_salary"}}}}
  • Cumulative_sum 累计求和
#Cumulative_sum 累计求和
POST employees/_search
{"size":0,"aggs":{"age":{"histogram":{"field":"age","min_doc_count":0,"interval":1},"aggs":{"avg_salary":{"avg":{"field":"salary"}},"cumulative_salary":{"cumulative_sum":{"buckets_path":"avg_salary"}}}}}}

聚合的作用范围

  • ES聚合分析的默认作用范围是query的查询结果集
  • ES还支持以下方式改变聚合的作用范围
    • Filter, Post Filter, Global
# Query
POST employees/_search 
{"size":0,"query":{"range":{"age":{"gte":20}}},"aggs":{"jobs":{"terms":{"field":"job.keyword"}}}}# Filter
POST employees/_search 
{"size":0,"aggs":{"older_person":{"filter":{"range":{"age":{"from":35}}},"aggs":{"jobs":{"terms":{"field":"job.keyword"}}}},"all_jobs":{"terms":{"field":"job.keyword"}}}}# Post field
# 一条语句,找出所有的job类型,还能找到聚合后符合条件的结果
POST employees/_search
{"aggs":{"jobs":{"terms":{"field":"job.keyword"}}},"post_filter":{"match":{"job.keyword":"Dev Manager"}}}# global
POST employees/_search 
{"size":0,"query":{"range":{"age":{"gte":40}}},"aggs":{"jobs":{"terms":{"field":"job.keyword"}},"all":{"global":{},"aggs":{"salary_avg":{"avg":{"field":"salary"}}}}}}

排序

  • 指定order,按照count和key进行排序
    • 默认情况,按照count降序排序
    • 指定size,就能返回相应的桶
POST employees/_search 
{"size":0,"query":{"range":{"age":{"gte":20}}},"aggs":{"jobs":{"terms":{"field":"job.keyword", "order":[{"_count":"asc"},{"_key":"desc"}]}}}}POST employees/_search 
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword","order":[{"avg_salary":"desc"}]},"aggs":{"avg_salary":{"avg":{"field":"salary"}}}}}}POST employees/_search
{"size":0,"aggs":{"jobs":{"terms":{"field":"job.keyword","order":[{"stats_salary.min":"desc"}]},"aggs":{"stats_salary":{"stats":{"field":"salary"}}}}}}

ES聚合分析不精准原因分析

  • ElasticSearch 在对海量数据进行聚合分析的时候会损失搜索的精准度来满足实时性的需求
  • Terms 聚合分析的执行流程
    • 执行流程

    • 不精准的原因: 数据分散到多个分片,聚合是每个分片的取 Top X,导致结果不精准

      • 可以不每个分片Top X,而是全量聚合,但势必这会有很大的性能问题
  • 如何提高聚合精确度
    • 设置主分片为1(7.x版本已经默认为1)
      • 适用场景:数据量小的小集群规模业务场景
    • 调大 shard_size 值
      • shard_size 值越大,结果越趋近于精准聚合结果值
      • 官方推荐:size*1.5+10
        • size:是聚合结果的返回值,客户期望返回聚合排名前三,size值就是 3
        • shard_size: 每个分片上聚合的数据条数。shard_size 原则上要大于等于 size
      • 可以通过show_term_doc_count_error参数显示最差情况下的错误值,用于辅助确定 shard_size 大小
      • 适用场景:数据量大、分片数多的集群业务场景
    • 将size设置为全量值,来解决精度问题
      • 将size设置为2的32次方减去1也就是分片支持的最大值,来解决精度问题
      • 弊端:如果分片数据量极大,这样做会耗费巨大的CPU 资源来排序,而且可能会阻塞网络
      • 适用场景:对聚合精准度要求极高的业务场景,由于性能问题,不推荐使用
    • 使用 Clickhouse/Spark 进行精准聚合
      • 适用场景:数据量非常大、聚合精度要求高、响应速度快的业务场景
# shard_size
GET kibana_sample_data_flights/_search 
{"size":0,"aggs":{"weather":{"terms":{"field":"OriginWeather","size":5,"shard_size":10,"show_term_doc_count_error":true}}}}
  • 在 Terms Aggregation 的返回中有两个特殊的数值
    • doc_count_error_upper_bound : 被遗漏的term 分桶,包含的文档,有可能的最大值
    • sum_other_doc_count: 除了返回结果 bucket的terms以外,其他 terms 的文档总数(总数-返回的总数)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523039.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI智能电销机器人的优势是什么,有什么特点?

机器学习、大数据、深度学习、云计算等的发展和应用&#xff0c;机器人完成复杂专业任务的能力越来越强。智能化机器人时代的到来&#xff0c;进一步拓宽了服务机器人的应用场景和服务模式&#xff0c;人工智能机器人的问世&#xff0c;更使电销机器人进入到了电销行业。我们一…

如何禁用USB存储设备|禁用USB储存和连接手机的方法有哪些?深度解析,四招搞定!

在企业网络安全管理中&#xff0c;禁用USB存储设备和限制手机连接至关重要。这不仅可以防止数据泄露&#xff0c;还能阻止恶意软件通过外部设备入侵。 本文将为你推荐四种行之有效的方法&#xff0c;帮助你全面禁用USB存储设备和连接手机的功能&#xff0c;让企业数据安全更有…

【SpringCloud应用框架】GateWay网关

Spring Cloud Alibaba 之初识GateWay网关 文章目录 一、网关介绍二、网关对比三、GateWay基本概念&#xff1a;执行流程&#xff1a; 总结 一、网关介绍 在微服务架构中&#xff0c;一个系统会被拆分为多个微服务。如果没有网关存在&#xff0c;我们只能在客户端记录梅哥为服务…

echarts横向柱状图让Y轴的名字在柱状图上方展示

效果 代码 myEcharts(){// 基于准备好的dom&#xff0c;初始化echarts实例this.myChart echarts.init(this.$refs.rankingList);// 指定图表的配置项和数据var option { title: { }, tooltip: { trigger: axis, axisPointer: { type: shadow } }, legend: { …

中职院校智能物联网应用专业群建设方案

一、引言 随着信息技术的飞速发展&#xff0c;智能物联网&#xff08;IoT&#xff09;作为新一代信息技术的重要组成部分&#xff0c;正深刻改变着人们的生活方式、生产模式和社会形态。为积极响应国家“中国制造2025”和“智慧城市”等战略部署&#xff0c;培养适应未来社会需…

开源 AI 智能名片 S2B2C 商城小程序在社区团购中的应用与价值

摘要&#xff1a;本文探讨了开源 AI 智能名片 S2B2C 商城小程序在社区团购中的重要作用。社区团购的团长角色多元&#xff0c;包括小区店主、水站与快递站站长、宝妈等&#xff0c;其用户基础广泛。优秀团长的专业引导和良好服务至关重要&#xff0c;而开源 AI 智能名片 S2B2C …

YOLOv8改进实战 | 引入混合局部通道注意力模块MLCA(2023轻量级)

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前…

YoloV8 single channel train + Onnx trans

yolov8目前不支持单通道图片训练&#xff0c;需要修改后才能支持。本文将介绍如何修改yolov8代码&#xff0c;来训练单通道图的yolov8模型&#xff0c;以及使用onnx进行模型转换的简单实践。 1、修改代码 git diff ultralytics/utils/checks.py diff --git a/ultralytics/utils…

Spire.PDF for .NET【文档操作】演示:创建 PDF 文档

通过代码创建 PDF 文档具有多种优势。例如&#xff0c;您可以轻松合并动态内容&#xff0c;如用户输入、数据库记录或实时数据。基于代码的 PDF 生成允许更大的自定义和自动化&#xff0c;最大限度地减少创建高度定制文档时的手动干预。在本文中&#xff0c;您将学习如何使用Sp…

【陪诊系统-PC管理端】axios的二次封装

二次封装axios 引入axios创建axios实例&#xff0c;添加配置信息&#xff0c;这里主要设置基础url和请求超时时间给上述创建的实例添加拦截器&#xff0c;对请求、响应分别进行拦截 根据接口文档显示&#xff0c;当登录成功后&#xff0c;每次请求陪诊师、订单信息都需要携带t…

fastchat与autogen使用要点澄清

说明&#xff1a; 本文重点是想使用autogen构建智能体&#xff0c;并且想要通过加载本地模型来构建&#xff0c;以灵活使用。但是autogen重点是以API调用支持openai, mistral等大模型使用的&#xff0c;对于使用国内的一些模型不是那么友好方便。然后在查找方法的过程中&#x…

一篇常见第三方库之以及详细使用示例教程

作者&#xff1a;郭震 我们介绍了几个常用的 Python 第三方库,包括 NumPy、Pandas、Matplotlib 和 Requests.本篇将通过一些简单的示例来演示如何有效地使用这些库,以帮助小白理解它们的基本用法.通过这些案例,你可以直观感受到这些库在日常编程中的价值. NumPy NumPy 是一个强…

规控面试复盘

目录 前言 一、京东方 1、CPP和C的区别是什么? 2、讲一下的ROS的话题通信 二、Momenta(泊车部门实习面试) 1、MPC的预测时间步是多少? 2、MPC的代价函数考虑的是什么? 三、九识 1、智能指针有哪些优缺点? 优点: 缺点: 2、Protobuf的数据传输效率为什么更高…

【陪诊系统-PC管理端】动态路由

先说说这里为什么要使用动态路由&#xff1f; 因为前面的菜单管理功能模块中&#xff0c;可以创建或修改不同权限&#xff0c;当前登录账号可以绑定不同的权限&#xff0c;不同权限能访问的功能页面不同&#xff0c;所以使用动态路由来控制。 而登录成功后&#xff0c;服务器…

前端报文加密

前端加密功能 前端提供简单的AES对称加密算法&#xff0c;注意key 和后端网关配置相同&#xff0c;这里打包混淆后&#xff0c;相对安全。 &#xff08;lun-ui\src\store\modules\user.js、base-gateway-dev.yml&#xff09; 后端解密功能 使用hutool提供的工具类进行解密pub…

【无标题】docker-compose一键部署项目,haproxy容器代理多个web或java容器

# 创建脚本&#xff0c;可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar 一、思路分析&#xff1a; &#xff08;1&#xff09;nginx 1、下载镜像&#xff0c;将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ …

连接型CRM+智能制造,助力医疗器械企业高质量发展

8月29日&#xff0c;由中国医疗器械行业协会智能制造与智慧监管分会主办&#xff0c;纷享销客参与协办的“数字化建设与智能制造助力医疗器械企业高质量发展”研讨会于苏州圆满落幕&#xff0c;国内知名医疗器械企业高层、行业专家及在医疗行业合规前沿的优秀专业人士齐聚一堂&…

【RabbitMQ】基本概念以及安装教程

1. 什么是MQ MQ( Message queue),从字面意思上看,本质是个队列,FIFO 先入先出&#xff0c;只不过队列中存放的内容是消息(message)而已.消息可以非常简单,比如只包含文本字符串,JSON等,也可以很复杂,比如内嵌对象.MQ多用于分布式系统之间进行通信 系统之间的调用通常有两种方式…

光盘安全隔离与信息单向导入系统-信刻

信刻从用户需求出发&#xff0c;为更多用户提供安全可靠的跨网数据单向导入/导出光盘摆渡系统解决方案&#xff0c;解决内外网数据交换的问题&#xff0c;确保数据交换过程的安全性。 公司所研发出的光盘安全隔离与信息单向导入系统依托软硬件相结合的技术&#xff0c;集策略摆…

mac 安装redis

官网下载指定版本的redis https://redis.io/ 目前3.2.0 是最新最稳定的 版本 这里是历史版本下载 下载指定版本 安装 1.放到自定义目录下并解压 2.打开终端&#xff0c;执行命令 cd redis的安装目录下 make test -- 此命令的作用是将redis源代码编译成可执行文件&#xff0c…