10.Elasticsearch应用(十)

Elasticsearch应用(十)

1.为什么需要聚合操作

聚合可以让我们极其方便的实现对数据的统计、分析、运算,例如:

  • 什么品牌的手机最受欢迎?
  • 这些手机的平均价格、最高价格、最低价格?
  • 这些手机每月的销售情况如何?

2.什么是聚合

聚合(aggregations)可以实现对文档数据的统计,分析,运算,在做聚合的时候往往是与文档过滤一起用的,一般不会对整个索引库进行聚合操作

3.聚合语法

在这里插入图片描述

4.聚合分类

  1. 桶聚合(Bucket): 用来对文档做分组
    • TermAggregation: 按照文档字段值分组
    • Date Histogram: 按照日期阶梯分组,例如一周为一组,或者一月为一组
  2. 度量聚合(Metric): 用以计算一些值,比如:最大值,最小值,平均值等
    • Avg: 求平均值
    • Max: 求最大值
    • Min: 求最小值
    • Stats: 同时求max,min,avg,sum等
  3. 管道聚合(pipeline): 其他聚合的结果为基础做聚合
  4. Matrix: 支持对多个字段的操作并提供一个结果矩阵

5.桶聚合

介绍

按照一定的规则,将文档分配到不同的桶中,从而达到分类的目的。ES提供的一些常见的
Bucket Aggregation

TermAggregation

需求

统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合

示例

在这里插入图片描述

默认排序规则

默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。我们可以修改结果排序方式:

在这里插入图片描述

注意

默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可

分词字段不行,必须是不能分词的字段

聚合还会返回查询的文档,所以建议设置size为0,因为聚合一般不需要返回文档,这样能提高性能

6.度量聚合

介绍

—些数学运算,可以对文档字段进行统计分析,类比MySQL中的 min(),max(),sum() 操作

States

介绍

同时求max,min,avg,sum等

需求

获取每个品牌的用户评分的min,max,avg等

示例

在这里插入图片描述

按照子聚合字段排序

在这里插入图片描述

7.聚合的作用范围

介绍

ES聚合分析的默认作用范围是query的查询结果集,同时ES还支持以下方式改变聚合的作用范围:Filter,Post Filter,Global

query

{"size": 0,"query": {"range": {"age": {"gte": 20}}},"aggs": {"jobs": {"terms": {"field": "job.keyword"}}}
}

Filter

{"size": 0,"aggs": {"older_person": {"filter": {"range": {"age": {"from": 35}}},"aggs": {"jobs": {"terms": {"field": "job.keyword"}}}},"all_jobs": {"terms": {"field": "job.keyword"}}}
}

Post Filter

{"aggs": {"jobs": {"terms": {"field": "job.keyword"}}},"post_filter": {"match": {"job.keyword": "Dev Manager"}}
}

Global

{"size": 0,"query": {"range": {"age": {"gte": 40}}},"aggs": {"jobs": {"terms": {"field": "job.keyword"}},"all": {"global": {},"aggs": {"salary_avg": {"avg": {"field": "salary"}}}}}
}

8.ES聚合分析不精准

介绍

ElasticSearch在对海量数据进行聚合分析的时候会损失搜索的精准度来满足实时性的需求
在这里插入图片描述

原因

从Terms聚合分析的执行流程来看

数据分散到多个分片,聚合是每个分片的取Top X,导致结果不精准。ES可以不每个分片Top X,而是全量聚合,但势必这会有很大的性能问题
在这里插入图片描述
在这里插入图片描述

如何提高聚合精确度

  • 设置主分片为1
  • 调大 shard_size 值
  • 将size设置为全量值,来解决精度问题
  • 使用Clickhouse/ Spark 进行精准聚合

设置主分片为1

注意

注意7.x版本已经默认为1

适用场景

数据量小的小集群规模业务场景

调大 shard_size 值

介绍

设置 shard_size 为比较大的值,官方推荐:size*1.5+10。shard_size 值越大,结果越趋近于精准聚合结果值。此外,还可以通过show_term_doc_count_error参数显示最差情况下的错误值,用于辅助确定 shard_size 大小

参数说明
  • size:是聚合结果的返回值,客户期望返回聚合排名前三,size值就是 3
  • shard_size: 每个分片上聚合的数据条数。shard_size 原则上要大于等于size
适用场景

数据量大、分片数多的集群业务场景

Terms聚合返回值
  • doc_count_error_upper_bound : 被遗漏的term 分桶,包含的文档,有可能的最大值
  • sum_other_doc_count: 除了返回结果 bucket的terms以外,其他 terms 的文档总数(总数-返回的总数)

将size设置为全量值,来解决精度问题

介绍

将size设置为2的32次方减去1也就是分片支持的最大值,来解决精度问题

原因

1.x版本,size等于 0 代表全部,高版本取消 0 值,所以设置了最大值(大于业务的全量值)

缺点

全量带来的弊端就是:如果分片数据量极大,这样做会耗费巨大的CPU 资源来排序,而且可能会阻塞网络

适用场景

对聚合精准度要求极高的业务场景,由于性能问题,不推荐使用

使用Clickhouse/ Spark 进行精准聚合

适用场景:数据量非常大、聚合精度要求高、响应速度快的业务场景

9.聚合性能优化

总览

  • 启用 eager global ordinals 提升高基数聚合性能
  • 插入数据时对索引进行预排序
  • 使用节点查询缓存
  • 使用分片请求缓存
  • 拆分聚合,使聚合并行化

启用 eager global ordinals 提升高基数聚合性能

介绍

高基数聚合 。高基数聚合场景中的高基数含义:一个字段包含很大比例的唯一值

本质

启用 eager_global_ordinals 时,会在刷新(refresh)分片时构建全局序号。这将构建全局序号的成本从搜索阶段转移到了数据索引化(写入)阶段

应用场景

global ordinals 中文翻译成全局序号,是一种数据结构,应用场景如下:

  • 基于 keyword,ip 等字段的分桶聚合,包含:terms聚合、composite 聚合等
  • 基于text 字段的分桶聚合(前提条件是:fielddata 开启),因为text默认不能分桶聚合
  • 基于父子文档 Join 类型的 has_child 查询和 父聚合

global ordinals 使用一个数值代表字段中的字符串值,然后为每一个数值分配一个bucket(分桶)

创建索引的同时开启:eager_global_ordinals
PUT /my‐index{"mappings": {"properties": {"tags": {"type": "keyword","eager_global_ordinals": true}}}
注意

开启 eager_global_ordinals 会影响写入性能,因为每次刷新时都会创建新的全局序号。为了最大程度地减少由于频繁刷新建立全局序号而导致的额外开销,请调大刷新间隔refresh_interval

动态调整刷新频率的方法如下

该招数的本质是:以空间换时间

PUT my‐index/_settings
{"index": {"refresh_interval": "30s"
}

插入数据时对索引进行预排序

介绍
  • Index sorting(索引排序)可用于在插入时对索引进行预排序,而不是在查询时再对索引进行排序,这将提高范围查询(range query)和排序操作的性能
  • 在 Elasticsearch 中创建新索引时,可以配置如何对每个分片内的段进行排序
版本要求

这是 Elasticsearch 6.X 之后版本才有的特性

示例
PUT /index
{"settings": {"index": {"sort.field": "create_time","sort.order": "desc"}},"mappings": {"properties": {"create_time": {"type": "date"}}}
}
注意

预排序将增加 Elasticsearch 写入的成本。在某些用户特定场景下,开启索引预排序会导致大约 40%-50% 的写性能下降。也就是说,如果用户场景更关注写性能的业务,开启索引预排序不是一个很好的选择

使用节点查询缓存

介绍

节点查询缓存(Node query cache)可用于有效缓存过滤器(filter)操作的结果。如果多
次执行同一 filter 操作,这将很有效,但是即便更改过滤器中的某一个值,也将意味着需要计算新的过滤器结果

例如,由于 “now” 值一直在变化,因此无法缓存在过滤器上下文中使用 “now” 的查询

无法适用缓存示例
PUT /my_index/_doc/1{"create_time":"2022‐05‐11T16:30:55.328Z"
}
#下面的示例无法使用缓存
GET /my_index/_search
{"query": {"constant_score": {"filter": {"range": {"create_time": {"gte": "now‐1h","lte": "now"}}}}}
}
使用缓存示例
PUT /my_index/_doc/1{"create_time":"2022‐05‐11T16:30:55.328Z"
}
# 下面的示例就可以使用节点查询缓存
GET /my_index/_search
{"query": {"constant_score": {"filter": {"range": {"create_time": {"gte": "now‐1h/m","lte": "now/m"}}}}}
}

上述示例中的“now-1h/m” 就是 datemath 的格式

如果当前时间 now 是:16:31:29,那么range query 将匹配 my_date 介于:15:31:00 和
15:31:59 之间的时间数据。同理,聚合的前半部分 query 中如果有基于时间查询,或者后
半部分 aggs 部分中有基于时间聚合的,建议都使用 datemath 方式做缓存处理以优化性

使用分片请求缓存

介绍

聚合语句中,设置:size:0,就会使用分片请求缓存缓存结果。size = 0 的含义是:只返
回聚合结果,不返回查询结果

示例
GET /es_db/_search
{"size": 0,"aggs": {"remark_agg": {"terms": {"field": "remark.keyword"}}}
}

拆分聚合,使聚合并行化

介绍

Elasticsearch 查询条件中同时有多个条件聚合,默认情况下聚合不是并行运行的。当为每
个聚合提供自己的查询并执行 msearch 时,性能会有显著提升。因此,在 CPU 资源不是
瓶颈的前提下,如果想缩短响应时间,可以将多个聚合拆分为多个查询,借助:msearch
实现并行聚合

常规的聚合实现
GET /employees/_search
{"size": 0,"aggs": {"job_agg": {"terms": {"field": "job.keyword"}},"max_salary": {"max": {"field": "salary"}}}
}
msearch拆分多个语句的聚合实现
GET _msearch
{"index":"employees"}
{"size":0,"aggs":{"job_agg":{"terms":{"field": "job.keyword"}}}}
{"index":"employees"}
{"size":0,"aggs":{"max_salary":{"max":{"field": "salary"}}}}

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

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

相关文章

SpringCloud-Knife4j文档聚合

在微服务架构下,如果给每个微服务都配置文档,那么每个微服务的接口文档都有自己独立的访问地址,这样要一个个打开每个微服务的文档非常麻烦。一般我们会采用聚合的办法,将所有微服务的接口整合到一个文档中,具体做法有…

web前端项目-五子棋【附源码】

五子棋(人机对弈) 本项目【五子棋】是一款人机对弈的策略型棋类游戏。可以选择落子方;游戏难度和是否显示落子次序。游戏双方分别使用黑白两色的棋子,在棋盘直线与横线的交叉点上进行对弈。五子棋可以促进大脑发育、提高思维能力…

openlayers+vue实现缓冲区

文章目录 前言一、准备二、初始化地图1、创建一个地图容器2、引入必须的类库3、地图初始化4、给地图增加底图 三、创建缓冲区1、引入需要的工具类库2、绘制方法 四、完整代码总结 前言 缓冲区是地理空间目标的一种影响范围或服务范围,是对选中的一组或一类地图要素(点、线或面…

华为三层交换机之基本操作

Telnet简介 Telnet是一个应用层协议,可以在Internet上或局域网上使用。它提供了基于文本的远程终端接口,允许用户在本地计算机上登录到远程计算机,然后像在本地计算机上一样使用远程计算机的资源。Telnet客户端和服务器之间的通信是通过Telnet协议进行的…

[蓝桥杯]真题讲解:冶炼金属(暴力+二分)

蓝桥杯真题视频讲解&#xff1a;冶炼金属&#xff08;暴力做法与二分做法&#xff09; 一、视频讲解二、暴力代码三、正解代码 一、视频讲解 视频讲解 二、暴力代码 //暴力代码 #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << &qu…

C语言第十弹---函数(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、函数的概念 2、库函数 2.1、标准库和头文件 2.2、库函数的使用方法 2.2.1、功能 2.2.2、头文件包含 2.2.3、实践 2.2.4、库函数文档的⼀般格式 …

PWM调光 降压恒流LED芯片FP7127:为照明系统注入新能量(台灯、GBR、调光电源、汽车大灯)

目录 一、降压恒流LED芯片FP7127 二、降压恒流LED芯片FP7127具有以下特点&#xff1a; 三、降压恒流LED芯片FP7127应用领域&#xff1a; LED照明和调光的新纪元随着LED照明技术的不断发展&#xff0c;人们对于照明调光的需求也越来越高。PWM调光技术作为一种常用的调光方法&…

RUST笔记:candle使用基础

candle介绍 candle是huggingface开源的Rust的极简 ML 框架。 candle-矩阵乘法示例 cargo new myapp cd myapp cargo add --git https://github.com/huggingface/candle.git candle-core cargo build # 测试&#xff0c;或执行 cargo ckeckmain.rs use candle_core::{Device…

设计模式—行为型模式之责任链模式

设计模式—行为型模式之责任链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&am…

wsl下安装ros2问题: Unable to locate package ros-humble-desktop 解决方案

❗ 问题 在wsl&#xff08;Ubuntu 22.04版本&#xff09;下安装ros的过程中&#xff0c;在执行命令 $ sudo apt install ros-humble-desktop一直弹出报错&#xff1a;Unable to locate package ros-humble-desktop 前面设置编码和添加源的过程中一直没有出现其他问题&#…

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

Docker 配置 Gitea Drone 搭建 CI/CD 平台 配置 Gitea 服务器来管理项目版本 本文的IP地址是为了方便理解随便打的&#xff0c;不要乱点 首先使用 docker 搭建 Gitea 服务器&#xff0c;用于管理代码版本&#xff0c;数据库选择mysql Gitea 服务器的 docker-compose.yml 配…

基于Java+SpringBoot+vue+elementui的校园文具商城系统详细设计和实现

基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现前言介绍&#xff1a;系统设计&#xff1a;系统开发流程用户登录流程系统操作流程 功能…

剧本杀小程序开发:打造沉浸式推理体验

随着社交娱乐形式的多样化&#xff0c;剧本杀逐渐成为年轻人喜爱的聚会活动。而随着技术的发展&#xff0c;剧本杀小程序的开发也成为了可能。本文将探讨剧本杀小程序开发的必要性、功能特点、开发流程以及市场前景。 一、剧本杀小程序开发的必要性 剧本杀是一种角色扮演的推…

【七、centos要停止维护了,我选择Almalinux】

搜索镜像 https://developer.aliyun.com/mirror/?serviceTypemirror&tag%E7%B3%BB%E7%BB%9F&keywordalmalinux dvd是有界面操作的&#xff0c;minimal是最小化只有命里行 镜像下载地址 安装和centos基本一样的&#xff0c;操作命令也是一样的&#xff0c;有需要我…

Unity配置表xlsx/xls打包后读取错误问题

前言 代码如下&#xff1a; //文本解析private void ParseText(){//打开文本 读FileStream stream File.Open(Application.streamingAssetsPath excelname, FileMode.Open, FileAccess.Read, FileShare.Read);//读取文件流IExcelDataReader excelRead ExcelReaderFactory…

idea中debug Go程序报错error layer=debugger could not patch runtime.mallogc

一、问题场景 在idea中配置了Go编程环境&#xff0c;可以运行Go程序&#xff0c;但是无法debug&#xff0c;报错error layerdebugger could not patch runtime.mallogc: no type entry found, use ‘types’ for a list of valid types 二、解决方案 这是由于idea中使用的d…

SpringBoot之分页查询的使用

背景 在业务中我们在前端总是需要展示数据&#xff0c;将后端得到的数据进行分页处理&#xff0c;通过pagehelper实现动态的分页查询&#xff0c;将查询页数和分页数通过前端发送到后端&#xff0c;后端使用pagehelper&#xff0c;底层是封装threadlocal得到页数和分页数并动态…

第14次修改了可删除可持久保存的前端html备忘录:增加一个翻牌钟,修改背景主题:现代深色

第14次修改了可删除可持久保存的前端html备忘录&#xff1a;增加一个翻牌钟&#xff0c;修改背景主题&#xff1a;现代深色 备忘录代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X…

11k+ star 一款不错的笔记leanote安装教程

特点 支持普通模式 支持markdown模式 支持搜索 安装教程 1.安装mongodb 1.1.下载 #下载 cd /opt wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.1.tgz 1.2解压 tar -xvf mongodb-linux-x86_64-3.0.1.tgz 1.3配置mongodb环境变量 vim /etc/profile 增…

LlamaIndex和LangChain谁更胜一筹?

▼最近直播超级多&#xff0c;预约保你有收获 今晚直播&#xff1a;《LlamaIndex构建应用案例实战》 —1— LlamaIndex OR LangChain&#xff1f; LangChain 和 LlamaIndex 都是 AGI 时代新的应用程序开发框架&#xff0c;到底有什么区别&#xff1f; 第一、LangChain 是一个围…