当前位置: 首页 > article >正文

ElasticSearch-聚合性能优化

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

  • 启用 eager global ordinals 提升高基数聚合性能
    • 高基数聚合场景中的高基数含义:一个字段包含很大比例的唯一值
    • 适用场景:高基数聚合
  • global ordinals(全局序号),是一种数据结构,应用场景:
    • 基于 keyword,ip 等字段的分桶聚合
      • 包含:terms聚合、composite 聚合等
    • 基于 text 字段的分桶聚合(前提条件是:fielddata 开启)
    • 基于父子文档 Join 类型的 has_child 查询和父聚合
  • global ordinals 使用一个数值代表字段中的字符串值,然后为每一个数值分配一个 bucket(分桶)
  • global ordinals 的本质是:启用 eager_global_ordinals 时,会在刷新(refresh)分片时构建全局序号
    • 这将构建全局序号的成本从搜索阶段转移到了数据索引化(写入)阶段
  • 创建索引的同时开启: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 6.X 之后版本才有的特性)
PUT /my_index
{"settings":{"index":{"sort.field":"create_time","sort.order":"desc"}},
 "mappings":{"properties":{"create_time":{"type":"date"}}}}
  • 预排序将增加 Elasticsearch 写入的成本
    • 在某些用户特定场景下,开启索引预排序会导致大约 40%-50% 的写性能下降
    • 如果用户场景更关注写性能的业务,开启索引预排序不是一个很好的选择

  • 使用节点查询缓存:节点查询缓存(Node query cache)可用于有效缓存过滤器(filter)操作的结果
    • 如果多次执行同一 filter 操作,这将很有效,但是即便更改过滤器中的某一个值,也将意味着需要计算新的过滤器结果
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 时,性能会有显著提升
    • 如果想缩短响应时间,可以将多个聚合拆分为多个查询
      • 借助: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.kler.cn/a/292968.html

相关文章:

  • 算法学习第一弹——C++基础
  • 【常见问题解答】远程桌面无法复制粘贴的解决方法
  • makefile 设置动态库路径参数
  • 记录使用documents4j来将word文件转化为pdf文件
  • Spring Boot中的自动装配机制
  • redis7.x源码分析:(1) sds动态字符串
  • 提交MR这个词儿您知道是什么意思吗?
  • 67-java 接口与抽象类的区别
  • 动态规划的解题思想
  • 黑马-Cloud21版-面试篇13:Sentinel源码分析
  • 【Oracle点滴积累】解决IMP-00017、ORA-20005、ORA-06512错误的方法
  • 黑神话悟空红孩儿怎么打 妖王红孩儿攻略
  • Vue2升级Vue3 --- 第三方库变化(基于gogocode)
  • Linux中Ubuntu系统安装Windows得字体
  • 利用实用规模量子计算模拟宇宙中最极端的环境
  • CSRF,SSRF和重放攻击的区别
  • 2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略(详细思路+matlab代码+python代码+论文范例)
  • 从0开始深度学习(3)——概率
  • macos下的 sed命令安装与使用 gnu-sed
  • 【LeetCode】07.整数反转
  • IDEA启动项目(Gradle项目)
  • 什么是上下文管理器
  • 一台手机一个ip地址吗?手机ip地址泄露了怎么办
  • vue2和vue3双向绑定的原理
  • 【软件安装】PyCharm安装教程(MAC)
  • 【计算机网络】描述TCP建立连接与断开的过程