es 3期 第21节-Bucket常用分桶聚合实战

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
#### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!
#### 3.Elasticsearch原则上适合一切非事务性应用场景或能够容许一定的延迟的事务性场景;能最大限度的替代mongodb与传统关系型数据库

##### 索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
##### 对历史数据无效!!!!
##### 一定要重建索引!!!!

#### 1、bucket分桶概念介绍

### 分桶聚合概念
###分桶概念
# 数据分组统计,类同数据库的group
## 核心技术
# 默认基于doc_values列式数据结构实现

### bucket分桶聚合过程
## 1.分桶聚合过程ES采用扫描,逐步创建分桶的方式,基于列式数据结构;
## 2.MySql采用扫描,全部分桶的方式,基于行式数据结构;
## 3.ES 尽量查询时处理所有统计,不支持迭代式的连续性统计;与mysqltemp表完全不是一种逻辑;

### Bucket聚合函数
## 1.terms常用分桶函数
## 2.其它分桶函数

#### 2、bucket常用分桶聚合实战

# 创建三个分片的索引
PUT kibana_sample_data_flights_3share
{"settings":{"number_of_shards":3}
}
# 准备数据
POST _reindex
{"source": {"index": "kibana_sample_data_flights"},"dest": {"index": "kibana_sample_data_flights_3share"}
}

### Terms词项分桶聚合
# 词项聚合
# 1.基于词项terms创建分桶
# 2.数据类型必须是keyword类型,不可以是text
## 查询参数
# size,返回分桶数量,默认 10,限制不能超过 65535,如果超过,需要设置超过参数,见后面设置
# shard_size,分片返回的数量,默认 shard size=size*1.5+10
# min_doc_count,限制分桶聚合的文档数量必须满足最小值,默认 1,
# shard_min_doc_count,限制分片最小满足的文档数量,或者词项数量,此值默认是0,必须小于 min_doc_count,建议值:(shard_min_doc_count=min_doc_count/分片数)

# 设置 min_doc_count,限制分桶返回的数量,对比前后的结果差异
GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {// 这里要加keyword,因为是text类型"field": "OriginCountry.keyword",// 返回的条数,在分片的情况下会统计不准,注意看返回值中的doc_count_error_upper_bound数量,非0表示有错误"size": 5,// 低于1000的数据去掉"min_doc_count": 1000,// 一般不建议用,使用size和min_doc_count就够了"shard_min_doc_count":100}}}
}

## error 词项分桶统计异常问题
# 词项分桶统计时,需要考虑一些参数设置,设置不对,会出现统计数据不准错误
# 查询参数
# show_term_doc_count_error,显示词项分桶统计数据错误信息,默认 false
# doc_count_error_upper_bound,文档数量溢出错误,查询的索引分片未全面覆盖所有数据
# sum_other_doc_count,词项数量溢出错误,查询的索引的聚合结果集里面未全面覆盖所有词项统计,造成统计出错

# 使用
GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword","size": 10,// 调整shard_size 查看doc_count_error_upper_bound错误数量,10、20、30、40、50"shard_size": 20,"show_term_doc_count_error":true}}}
}

## max_buckets 分桶数量限制
# 查询参数
# search.max buckets,分桶聚合限制,默认65535

GET _cluster/settings
# 设置成最大5个
PUT _cluster/settings
{"transient": {"search.max_buckets": 5}
}

# 设置max_buckets后查询报错

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword",// 查询10个报错"size": 10}}}
}
# 报错内容
# {
#   "error": {
#     "root_cause": [],
#     "type": "search_phase_execution_exception",
#     "reason": "",
#     "phase": "fetch",
#     "grouped": true,
#     "failed_shards": [],
#     "caused_by": {
#       "type": "too_many_buckets_exception",
#       "reason": "Trying to create too many buckets. Must be less than or equal to: [5] but this number of buckets was exceeded. This limit can be set by changing the [search.max_buckets] cluster level setting.",
#       "max_buckets": 5
#     }
#   },
#   "status": 503
# }

# 修改回去

PUT _cluster/settings
{"transient": {"search.max_buckets": 65535}
}

## 词项嵌套分桶
# 查询参数
# ES 聚合嵌套深度,建议不要超过3层。

# 查询目的地国家分组统计下面,3层嵌套

GET kibana_sample_data_flights_3share/_search
{"track_total_hits": true,"size": 0,"aggs": {"terms_OriginCountry": {"terms": {"field": "OriginCountry.keyword","size": 10,"show_term_doc_count_error": true},"aggs": {"terms_DestCountry": {"terms": {"field": "DestCountry.keyword","size": 10,"show_term_doc_count_error": true},"aggs": {"terms_DestCityName": {"terms": {"field": "DestCityName.keyword","size": 10,"show_term_doc_count_error": true}}}}}}}
}

## sort 词项分桶结果排序
# 查询参数
# order,结果集排序,默认按照分桶的文档数量排序,同样也支持多个维度排序
# asc/desc,排序方式
# _count,按照数量排序,默认排序方式
# _key,按照词项排序

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword","size": 10,"order": {"_key": "asc"}}}}
}

# 使用二级统计结果排序

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword","size": 10,"order": {// 使用二级统计结果中的值排序"stats_FlightTimeMin.max": "asc"}},// 二级统计"aggs": {"stats_FlightTimeMin": {"stats": {"field": "FlightTimeMin"}}}}}
}

## script 词项分桶脚本支持
# ES 几乎所有的聚合都支持脚本方式,词项分桶也支持,有很多场景需要从字符串中提取部分值作为分桶词项,或者需要组合多个字段值部分内容。
# 查询参数
# script,脚本聚合表达式

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword",// 使用脚本拼接一个后缀"script": """doc['OriginCountry.keyword'].value + '-script';""", "size": 10,"order": {"_count": "asc"}}}}
}

## 词项分桶键值过滤
# 查询参数
# include,包括词项分桶值
# exclude,不包含词项分桶值
# 支持精确键值过滤与 模糊匹配方式过滤,即通过正则表达式过滤
# 这个与query的区别在于,query是在数据源头就过滤了,这是统计后再过滤(有过滤需求优先使用query)

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword",// 包括词项,"include": ["AT","US"], // 排除词项"exclude": ["US"], "size": 10,"order": {"_count": "asc"}}}}
}

## partition 词项分桶分区聚合
# 查询参数
# 很多时候,需要统计的分桶数量太多,一次运行很慢,可以借助分区机制,在客户端合并
# partition,分区编号
# num_partitions,分区数量
# partition 其实可以使用前面的异步来实现,不推荐使用,作为了解即可

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword","include": {// 从0开始,不能大于num_partitions,这里需要查询三次,值分别是0,1,2,拿到结果后自己做聚合起来"partition": 0,// 分成3块统计"num_partitions":3}, "size": 10,"order": {"_count": "asc"}}}}
}

## collect_mode 深度优先与广度优先
# 查询参数
# collect_mode,词项分桶统计收缩模型,选择范围广度优先与深度优先
# depth_first,深度优先,擅长分桶数据小的,分桶比较固定的,建议 10000 以内,即 topX 类型,默认
# breadth_first,广度优先,擅长分桶数据量大的,如果要返回所有的桶,采用这种
# 深度优先就是先构建桶进行统计,统计完后再接着构建另一个桶进行统计
# 广度优先就是先构建所有的桶,然后再进行统计
# 区别在于一个是统计完后在剪枝,一个是剪枝完后在统计

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword",// 数据量少的时候看不出差异,数据量多的时候可以根据这个参数进行调优"collect_mode": "breadth_first", "size": 10,"order": {"_count": "asc"}}}}
}

## execution_hint 词项分桶存储选择
# ES执行词项分桶,默认采用全局序号,可以保证海量的词项都可以统计下来,并且资源占用线性增长但由于全局序号数据结构在应对少量分桶统计时,性能不佳,故内部设计了map结构。
# 查询参数
# execution_hint,词项分桶临时存储设置,可选择全局序号与 map 结构
# global_ordinals,全局序号结构,需要做词项与号的映射
# map,字典结构,词项数量在,直接基于词项值统计
# 在词项数量万级别,文档数量百万级以内,map 效率高,在此之上全局序号更高效

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_OriginCountry":{"terms": {"field": "OriginCountry.keyword",// <海量>数据统计时,可以根据这个参数进行调优"execution_hint": "map", "size": 10,"order": {"_count": "asc"}}}}
}

## eager_global_ordinals 提前加载全局序号
# 查询参数
# ES 在使用全局序号时,第一次需要从 doc_values 读取所有值,构建全局序号,若能通过设置字段属性,则可以提前加载到内存,避免查询响应慢
# eager_global_ordinals,设置提前加载全局序号,提前构建

DELETE device-001
# 创建索引的时候指定
PUT /device-001
{"mappings": {"properties": {"deviceId": {"type": "keyword","eager_global_ordinals": true}}}
}
// 更新索引指定
PUT device-001/_mapping
{"properties": {"deviceId": {"type": "keyword","eager_global_ordinals": true}}
}

## rare_terms 词项分桶
# 稀有词项统计,等同于 terms词项统计按照文档数量倒排
# 查询参数
# rare_terms,稀有词项分桶查询表达式
# field,指定字段
# max_doc_count,限制满足条件最多的文档匹配数量,实际数据超过此值时,内部采用一种非精确的过滤算法CuccooFilter机制计算,此算法比bloomfilter 更加节约资源
# precision,精确度控制,请参考cuccoofilter原理论文

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_DestCountry":{"rare_terms": {"field": "DestCountry.keyword","max_doc_count": 10}}}
}
GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_DestCityName":{"rare_terms": {"field": "DestCityName.keyword","max_doc_count": 1,"precision":0.0001}}}
}

## text-term 文本字段分桶
# 默认情况下,text类型是不能支持 terms词项分桶的,直接出错
# 若要 text 类型支持,则需要启用 fielddata 字段属性
# fielddata 属性默认采用内存,需要消耗很大内存资源
# 建议尽量少使用或者不使用,通过改变业务形式采用 keyword 更好
# 查询参数
# fielddata,设置 text字段类型属性,取值范围 true/false,默认 false

# 基于航班信息聚合统计,使用 dest航班目的地聚合,默认会报错

GET kibana_sample_data_flights_3share/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_Dest":{"terms": {"field": "Dest"}}}
}
# 通过设置新索引,设置 fieldata 属性
PUT kibana_sample_data_flights_fielddata
{"mappings":{"properties":{"Dest":{"type":"text","fielddata":true,"fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}
}
POST _reindex
{"source": {"index": "kibana_sample_data_flights"},"dest": {"index": "kibana_sample_data_flights_fielddata"}
}
# 查询新索引,对比分桶数据结果
GET kibana_sample_data_flights_fielddata/_search
{"track_total_hits":true,"size":0,"aggs":{"terms_Dest":{"terms": {"field": "Dest","size": 5}}}
}

## multi_terms 多词项分桶
# 与 terms 单词项分桶聚合类似,仅仅是一次支持多个词项
# 性能上有差异,不如 terms 单词项高
# 运用非常便利,尽量慎用或者采用其它的替代,如nested类型或者composite组合
# ES=7.12 之后增加
# 查询参数
# multi_terms,多词项分桶查询表达式

GET kibana_sample_data_flights_3share/_search
{"track_total_hits": true,"size": 0,"aggs": {"DestCountry_OriginCountry": {"multi_terms": {"terms": [{"field": "DestCountry.keyword"},{"field": "OriginCountry.keyword"}]}}}
}

#### 3、常用分桶聚合建议与经验分享
## 分桶与分片关系(分片多了,分桶的精准度会降低,需要通过参数调整)
## 避免文本分词聚合(虽然可以通过fielddate设置统计,非常消耗资源,不推荐使用)
## 全局序号性能问题(可以通过索引配置提前加载)


# bucket 分桶聚合
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-aggregations-bucket.htm
# terms 词项分桶聚合
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-aggregations-bucket-terms-aggregation.html
# multi terms 多词项分桶聚合
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-aggregations-bucket-multi-terms-aggregation.htm
# 深度优先与广度优先
# https://www.elastic.co/guide/cn/elasticsearch/guide/current/_preventing_ combinatorial_explosions.html
# 全局序号属性解读
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/eager-global-ordinals.html
# 全局序号技术原理
# https://www.elastic.co/cn/blog/improving-the-performance-of-high-cardinality-terms-aggregatons-in-elasticsearch
# fielddata 参数解读
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/text.html#fielddata-mapping-param
# fielddata 堆栈容量设置
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/modules-fielddata.html

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

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

相关文章

【ArcGISPro/GeoScenePro】解决常见的空间参考和投影问题

修复空间参考缺失的图像 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 查看属性坐标 查看属性范围 范围值并不是零或接近于零。 这意味着栅格具有范围,因此其已正确进行

集线器,交换机,路由器,mac地址和ip地址知识记录总结

一篇很不错的视频简介 基本功能 从使用方面来说&#xff0c;都是为了网络传输的标识&#xff0c;和机器确定访问对象 集线器、交换机和路由器 常听到路由器和集线器&#xff0c;下面是区别&#xff1a; 集线器 集线器&#xff1a;一个简单的物理扩展接口数量的物理硬件。…

跳跃表(跳表)是什么

为什么要有跳表 正常链表只能一个一个往下走但是如果我直到我的目标位置就在链表的中部但是我还得一步一步走过去很浪费时间&#xff0c;所以跳表就是在正常链表的基础上添加了多步跳跃的指针。 什么是跳表 跳表&#xff08;Skip List&#xff09;是一种概率型的数据结构&am…

【自动驾驶汽车通讯协议】RGMII通信技术详解

文章目录 0. 前言1. RGMII概述1.1 RGMII说明1.2 RGMII作用&目的 2. RGMII的发展历史2.1 MII (Media Independent Interface)2.2 GMII (Gigabit Media Independent Interface)2.3 RGMII (Reduced Gigabit Media Independent Interface) 3. 架构设计3.1 接口信号3.2 信号时序…

浏览器选中文字样式

效果 学习 Chrome: 支持 ::selection。Firefox: 支持 :-moz-selection 和 ::selection。Safari: 支持 ::selection。Internet Explorer: 支持 :-ms-selection。Microsoft Edge: 支持 ::-ms-selection 和 ::selection。 代码 <!DOCTYPE html> <html lang"en&qu…

RAG实战:本地部署ragflow+ollama(linux)

1.部署ragflow 1.1安装配置docker 因为ragflow需要诸如elasticsearch、mysql、redis等一系列三方依赖&#xff0c;所以用docker是最简便的方法。 docker安装可参考Linux安装Docker完整教程&#xff0c;安装后修改docker配置如下&#xff1a; vim /etc/docker/daemon.json {…

如何免费解锁 IPhone 网络

您是否担心 iPhone 上的网络锁定&#xff1f;如果您的 iPhone 被锁定到特定运营商&#xff0c;解锁它可以连接到不同的运营商。好吧&#xff0c;我们为您准备了一份指南。 iPhone运营商免费解锁将是小菜一碟。在我们的解锁运营商 iphone 免费指南中。我们为您提供了一份简介&am…

人工智能安全——联邦学习的安全攻击与防护

参考论文FedMDFG: Federated Learning with Multi-Gradient Descent and Fair Guidance (AAAI-2023) 背景 随着人工智能技术的飞速发展&#xff0c;隐私保护和数据安全越来越受到重视。联邦学习&#xff08;Federated Learning, FL&#xff09;作为一种分布式隐私保护的机器学…

R机器学习:神经网络算法的理解与实操,实例解析

神经网络算法是一种模仿生物神经网络&#xff08;尤其是人脑&#xff09;结构和功能的算法。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些神经元组织成层&#xff0c;通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演…

wsl linux CUDA安装、卸载、清理、版本降级、升级过程详解

目录 1 前言2 卸载与重新安装2.1 列出所有与 CUDA 相关的包2.2 卸载 CUDA2.3 删除残留文件2.4 移除 CUDA 仓库包2.5 删除仓库目录2.6 移除所有 CUDA 相关包2.7 删除 CUDA 的优先级配置文件2.8 查看所有 APT 源中的 CUDA 条目2.9 移除或禁用不需要的 CUDA 仓库源2.10 删除所有 A…

牛客网刷题 ——C语言初阶——OR76 两个整数二进制位不同个数

1. 牛客网题目&#xff1a;OR76 两个整数二进制位不同个数 牛客网OJ链接 描述&#xff1a; 输入两个整数&#xff0c;求两个整数二进制格式有多少个位不同 输入描述&#xff1a;两个整数 输出描述&#xff1a;二进制不同位的个数 示例1 输入&#xff1a;22 33 输出&#xff1a…

【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理

使用AWS SDK碰到的错误&#xff0c;其实很简单&#xff0c;要装个扩展库 保持如下 Fatal error: Uncaught Aws\Auth\Exception\UnresolvedAuthSchemeException: This operation requests sigv4a auth schemes, but the client currently supports sigv4, none, bearer, sigv4-…

设计模式 结构型 装饰器模式(Decorator Pattern)与 常见技术框架应用 解析

装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff0c;又称为包装器模式&#xff08;Wrapper Pattern&#xff09;&#xff0c;是一种结构型设计模式。它允许在不改变原有对象结构的基础上&#xff0c;动态地给对象添加一些新的职责&#xff08;即增加其额外功能&a…

<论文>聊聊初代LLaMA

一、摘要 本文介绍来自Meta的论文《LLaMA: Open and Efficient Foundation Language Models》&#xff0c;这篇2023年的研究发布了开源的LLaMA系列大模型&#xff0c;轰动一时。 译文&#xff1a; 我们推出了 LLaMA&#xff0c;一系列参数规模从 70 亿到 650 亿的基础语言模型。…

把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用

将vue项目发布成npm库文件&#xff0c;第三方通过npm依赖安装使用&#xff1b;使用最近公司接了一个项目&#xff0c;这个项目需要集成到第三方页面&#xff0c;在第三方页面点击项目名称&#xff0c;页面变成我们的项目页面&#xff1b;要求以npm库文件提供给他们&#xff1b;…

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码&#xff0c;我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时&#xff0c;才会发现它就像一本魔法书&#xff0c;轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具&#xff1f;它究…

【重庆】《政务数字化应用费用测算规范》(T/CDCIDA 001—2023)-省市费用标准解读系列36

《政务数字化应用费用测算规范&#xff08;报批稿&#xff09;》于2023年11月18日实施&#xff0c;本文件按照GB/T 1.1-2020给出的规则起草&#xff0c;主要适用于重庆政务数字化应用项目的费用测算。我司基于专业第三方信息化项目造价机构角度&#xff0c;从标准创新点、定制软…

Python | 学习type()方法动态创建类

getattr方法的使用场景是在访问不存在的属性时&#xff0c;会触发该方法中的处理逻辑。尤其是在动态属性获取中结合 type()动态创建类有着良好的使用关系。 type()方法常用来判断属性的类别&#xff0c;而动态创建类不常使用&#xff0c;通过如下的几个实例来学习使用&#xff…

机器学习之逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告

逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告 目录 逻辑回归算法、数据标准化处理及数据预测和数据的分类结果报告1 逻辑回归算法1.1 概念理解1.2 算法导入1.3 算法优缺点 2 LogisticRegression理解2.1查看参数定义2.2 参数理解2.3 方法2.4基本格式 3 数据标准…

Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录

VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的3D可视化开发工具包&#xff0c;用于开发可视化和图形处理应用程序。VTK提供了一系列的算法和工具&#xff0c;用于创建、渲染和处理复杂的3D图形和数据。VTK由C编写&#xff0c;并提供了Python、Java和Tcl等语言…