ElasticSearch-聚合操作

news2024/11/14 17:44:36
  • 聚合的分类 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.coloradmin.cn/o/2108013.html

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

相关文章

5.1.数据结构-c/c++二叉树详解(上篇)(遍历,几种二叉树)

本章所有代码请见&#xff1a;5.3.数据结构-c/c二叉树代码-CSDN博客 目录 一. 二叉树的基本介绍 1.2 满二叉树 1.3 完全二叉树 1.4 搜索二叉树 1.5 平衡二叉搜索树 二. 二叉树的常用操作 2.1 二叉树的定义 2.2 创建一个新的节点 2.3 构建一颗树 2.5 销毁一棵树 三.…

One-Shot Imitation Learning with Invariance Matching for Robotic Manipulation

发表时间&#xff1a;5 Jun 2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2408639872513958656&noteId2408640378699078912 作者单位&#xff1a;Rutgers University Motivation&#xff1a;学习一个通用的policy&#xff0c;可以执行一组不…

Linux学习笔记6 值得一读,Linux(ubuntu)软件管理,搜索下载安装卸载全部搞定!(中)

Linux学习笔记5 值得一读&#xff0c;Linux&#xff08;ubuntu&#xff09;软件管理&#xff0c;搜索下载安装卸载全部搞定&#xff01;(上)-CSDN博客 一、前文回顾 上一篇文章我们了解了软件管理的基本概念和软件管理的几种常用工具。我们了解了软件包是由什么形式存在&#…

srt字幕文件怎么制作?分享几个简单步骤,新手必学

srt字幕文件怎么制作&#xff1f;随着短视频平台的发展&#xff0c;现在很多小伙伴喜欢用视频记录生活&#xff0c;分享美好瞬间。在将视频上传到视频平台的时候&#xff0c;我们需要对视频进行剪辑处理。而字幕的使用对提高视频内容的可理解性与传播性变得愈发重要。srt字幕文…

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的&#xff0c;所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…

基于SpringBoot+Vue的美术馆管理系统(带1w+文档)

基于SpringBootVue的美术馆管理系统(带1w文档) 基于SpringBootVue的美术馆管理系统(带1w文档) 本课题研究和开发美术馆管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高美术馆管理系统信息处理速度&#xff0c;规范美术馆管理系统信…

【高等数学学习记录】集合

1 知识点 1.1 集合的概念 集合 指具有某种特定性质的事物的总称。集合的元素 组成集合的事物称为集合的元素&#xff08;简称元&#xff09;。有限集、无限集 含有限个元素的集合&#xff0c;则称为有限集&#xff1b;反之&#xff0c;称为无限集。子集 设 A A A、 B B B是两…

HTTP Cookie 和 session

HTTP Cookie HTTP协议本身是无状态&#xff0c;无连接的。 无状态是指&#xff0c;客户每次发起请求&#xff0c;服务器都不认识客户是谁&#xff0c;它只会根据请求返回对应的资源响应。 无连接不是指TCP的无连接&#xff0c;通常指的是HTTP协议本身不在请求和响应之间维护…

哪款宠物空气净化器能更好的清理浮毛?希喂、352、IAM测评分享

家里这三只可爱的小猫咪&#xff0c;已然成为了我们生活中不可或缺的家庭成员&#xff0c;陪伴我们度过了说长不长说短不短的五年时光。时常庆幸自己当年选择养它们&#xff0c;在我失落的时候总能给我安慰&#xff0c;治愈我多时。 但这个温馨的背后也有一点小烦恼&#xff0…

使用Redis实现记录访问次数(三种方案)

目录 0. 前言1. 使用Filter实现2. 使用AOP实现 1. 导入依赖 2. 写一个切面类&#xff0c;实现统计访问次数。 3. 开启AOP 4. 测试 5. plus版本 (1) 新建一个bean类 (2) 新增一个controller方法 (3) 新增一个循环增强方法 (4) 测试…

龙芯+FreeRTOS+LVGL实战笔记(新)——04开启主任务

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇&#xff0c;主要的区别在于实时操作系统的不同&#xff0c;章节的安排和任务的推进保持一致&#xff0c;并对源码做了改进和优化&#xff0c;各位可以先到本人主页下去浏览另一专栏的博客列表&#xff08;目前已撰…

基于OGC300工业级LORA网关与OM201L数传终端的化工厂人员定位系统解决方案

化工行业作为高风险的行业之一&#xff0c;其安全管理一直备受关注。化工生产过程中涉及到各种危险品和复杂的工艺&#xff0c;一旦发生事故&#xff0c;往往会造成严重的人员伤亡和财产损失。因此&#xff0c;化工企业急需一套可靠的安全管理系统来监测安全隐患、预防事故发生…

【2024数模国赛赛题思路公开】国赛A题思路丨附可运行代码丨无偿自提

2024年国赛A题解题思路 【题目分析】 问题1&#xff1a;舞龙队沿螺距为55 cm的等距螺线顺时针盘入&#xff0c;给出300秒内舞龙队每秒的位置和速度 分析思路&#xff1a; 螺线方程&#xff1a; 需要建立螺线方程&#xff0c;以便描述龙头及每节板凳的位置。螺线是基于极坐标系…

图形几何算法 -- 凸包算法

前言 常用凸包算法包括Graham Scan 算法和Jarvis March (Gift Wrapping) 算法&#xff0c;在这里要简单介绍的是Graham Scan 算法。 1、概念 凸包是一个点集所包围的最小的凸多边形。可以想象用一根绳子围绕着一群钉子&#xff0c;绳子所形成的轮廓便是这些钉子的凸包。在计算…

谈谈AI领域的认知误区、机会点与面临的挑战

谈谈AI领域的认知误区、机会点与面临的挑战 最近2年&#xff0c;AI 技术的火爆&#xff0c;到处都能看到大家在讨论AI 的发展与机会。这里我们讨论一下AI 认知的误区&#xff0c;机会点和面临的挑战。 by kimmking AI 认知的误区 这年头掀起了所有人讨论AI热潮的同时&#xf…

使用C语言实现字符推箱子游戏

使用C语言实现字符推箱子游戏 推箱子&#xff08;Sokoban&#xff09;是一款经典的益智游戏&#xff0c;玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子&#xff0c;不能拉箱子。只能将箱子推到…

【内容审核】对审核结果进行封装

目录 1、分析返回结果示例 2、自定义封装类 在【内容审核】Java实现七牛云内容审核功能七牛 java 审核-CSDN博客 中实现了文本、图片和视频的审核功能&#xff0c;但是这些功能灵活性不够&#xff0c;既不能自己设置审核的强度&#xff0c;也不能内容违规的详细信息&#xff…

【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴图卡,有答案

背景需求&#xff1a; 前文提到6宫格数独的图片6*636图&#xff0c;如果将6张任务卡放在一个A4上&#xff0c;看上去6种动物很小&#xff0c;所以我换了一个word模板&#xff0c;变成了2张任务卡放在一个A4上。 【教学类-52-07】20240903动物数独&#xff08;6宫格&#xff0…

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

003: Visual Studio 配置 VTK 开发环境的方法与比较

目录 简介&#xff1a; 1 配置属性方法&#xff1a; 2 创建配置文件 3 在新项目中导入props文件 总结&#xff1a; 简介&#xff1a; 编译好VTK后&#xff0c;在安装目录里面有通常有包含bin,lib和include等文件夹&#xff0c;要在自己的项目里面使用VTK&#xff0c;主要…