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"}}}}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Linux任务管理与守护进程

Linux任务管理与守护进程 一、任务管理1、进程组概念2、作业概念3、会话概念4、相关操作(1)前台进程&后台进程(2)jobs、fg、bg、kill 5、ps命令查看指定的选项 二、守护进程1、守护进程的概念2、守护进程的查看3、守护进程的创…

支付宝AES如何加密

继之前给大家介绍了 V3 加密解密的方法之后,今天给大家介绍下支付宝的 AES 加密。 注意:以下说明均在使用支付宝 SDK 集成的基础上,未使用支付宝 SDK 的小伙伴要使用的话老老实实从 AES 加密原理开始研究吧。 什么是AES密钥 AES 是一种高级加…

2.依附弹窗(AttachListPopup)

愿你出走半生,归来仍是少年! 环境:.NET 7 基于基础的Popup对象实现的依附于某个控件的弹窗,弹窗可呈现数组对象,达到较好的选择交互效果。 1.布局 通过Border实现圆角边框轮廓,然后通过内部的ListView实现列表展示。…

Cesium数据加载

文章目录 0.引言1.影像加载1.1Bing地图1.2天地图1.3ArcGIS在线地图1.4高德地图1.5OSM影像1.6MapBox影像 2.OGC地图服务2.1WMS2.2WMTS2.3TMS 3.GeoJSON数据加载4.KML数据加载5.TIFF数据加载6.点云数据加载7.地形数据加载7.1在线地形数据加载7.2本地地形数据加载 8.倾斜摄影模型数…

xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

图标设置 1,根据图片构建各类尺寸的图标2.xcode打开ios文件3.xcode设置图标4.打包提交审核,即可(打包教程可通过我的主页查找) 1,根据图片构建各类尺寸的图标 工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的ios\Runner\Assets.xcassets\AppIcon.ap…

没有外网Nginx如何配置如何开启https

判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl,由于服务器没有外网,可以离线安装openssl-3.0.1.tar.gz,我是在有网的服务器直接下载的,然后再上传到这台无网的服务器上 wget https://www.open…

HttpClient的使用与封装

HttpClient的使用与封装 配置 首先,我们要引入maven依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>这里可以单独引入,如果我…

linux操作系统网络编程套接字(实现一个udp通讯demo)

文章目录 理解源IP地址和目的IP地址认识端口号理解 "端口号" 和 "进程ID理解源端口号和目的端口号 认识TCP协议认识UDP协议什么是面向字节流和面向数据报流以及有无连接是什么意思 网络字节序socket编程接口socket 常见APIsockaddr结构sockaddr_in 结构in_addr结…

下载大文件时内存溢出情况分析解决

基于SpringBoot和阿里的OSS实现了一个下载文件的功能。 大概原理是这样的&#xff1a; 用户请求下载资源&#xff0c;服务端接收到请求之后从OSS中将用户需要的资源捞出来&#xff0c;然后以流的方式写给客户端。 遇到一个这样的问题&#xff1a; 下载小文件没有问题&#…

【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09; 水仙花数是指一个 3 位数&a…

去中心化人工智能迸发应用潜力,或给 Web3 带来无限畅想

​ 原文&#xff1a;https://www.caseycaruso.com/thoughts/decentralized-ai 作者&#xff1a;Casey&#xff5c;Paradigm 投资合伙人 编译&#xff1a;TinTinLand 编者注&#xff1a;本文对于去中心化 Web3 技术和人工智能领域之间的交叉应用进行了梳理&#xff0c;并列举了…

springboot130社团管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

什么是框架 确定伦敦金的框架为何重要?

在伦敦金投资中&#xff0c;我们要进行分析或者交易&#xff0c;都要将伦敦金走势置于一个框架内。什么才是框架呢&#xff1f;笔者认为&#xff0c;在当前伦敦金走势的上方和下方画出支撑阻力位&#xff0c;这就是框架。但我们要注意框架得能够立得起来&#xff0c;那才算是好…

理顺 QR 分解算法

咱们网站的这个公式编辑器&#xff0c;估计是后台生成图片后贴回来的&#xff0c;固定分辨率而且分辨率不高。 还不如先离线 latex 生成 pdf 后再截图上来 1. Why QR When A and b are known, to solver the minimization of , where . The reduction of A to various canoni…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

文本检索性能提升 40 倍,Apache Doris 倒排索引深度解读

在 OLAP 领域&#xff0c;Apache Doris 已成为高性能、高并发以及高时效性的代名词。在面向海量数据的复杂查询需求时&#xff0c;除硬件配置、集群规模、网络带宽等因素外&#xff0c;提升性能的核心在于如何最大程度地降低 SQL 执行时的 CPU、内存和 IO 开销&#xff0c;而这…

记 Rxjava zip操作符遇到的问题

在项目中遇到了类似下面这样的代码 本意是希望当zip操作符中三个Observable执行完毕之后&#xff0c;将他们返回的数据统一进行处理 Observable.zip(startFirst(), startSecond(), startThird(),(first, second, third) -> {Log.i("Rxjava", "handle all dat…

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。