关于ElasticSearch的Update By Query的那些著名的坑

2023-11-16

提起es的Update By Query很多人一定也不陌生,它对应的就是关系型数据库的update set ... where...语句,这对应一般的存储引擎而言算是最基本的功能,但它的坑确不少,多到让你使用起来很奔溃,比如批量更新时非事务模式执行(允许部分成功部分失败)、大批量操作会超时、频繁更新会报错(版本冲突)、脚本执行太频繁时又会触发断路器等。

1. 非事务模式执行

在前面update_by_query相关文章也大概讲过,所有更新和查询失败都会导致_update_by_query中止,并在响应失败时返回。已执行的更新仍然存在。换句话说,该过程不会回滚,只会中止。

2. java.io.IOException: listener timeout

在前面的文章中也讲过,默认是30000ms,但补充一点:修改超时时间并非真正的解决方案。

3. VersionConflictEngineException

由于es是准实时的,默认refresh_interval: "1s",_update_by_query在索引启动时获取索引的快照,这意味着如果文档在拍摄快照的时间和处理索引请求之间发生更改,则会出现版本冲突。说白了,1s内多次修改同一个document就会发生,你通过设置version_conflicts=false(会忽略错误),但并未解决问题啊,当然了,你还能有2中方式解决该问题:

  • retries,一直重试,UpdateByQueryRequestBuilder中默认为11次,可见对es是有一定的压力的
  • refresh=true,一直去刷盘,当然可以解决准实时的问题,但磁盘消耗是很多的

4. IllegalArgumentException: failed to execute script

Too many dynamic script compilations within, max: [75/5m],看意思就懂,script修改语句只能接受5分钟内75次,what?具体可参与官方script-compilation-circuit-breaker,怎么滴也得配置个十几万次吧

总结,使用Update By Query要重点关注上面的4个问题,特别是涉及到大批量的修改,特别要关注监控信息(GET _tasks?detailed=true&actions=*byquery),个人建议要限流,比如:可通过前置mongodb(定时定量去更新)或者更新失败后记录到新的index中后续定时定量去补偿。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于ElasticSearch的Update By Query的那些著名的坑 的相关文章

随机推荐

  • 深度学习在计算机视觉领域(图像,视频,3-D点云,深度图)的应用一览 计算机视觉图像处理

    先说图像 视频处理 计算机视觉的底层 不低级 图像处理 还有视频处理 曾经是很多工业产品的基础 现在电视 手机还有相机 摄像头等等都离不开 是技术慢慢成熟了 传统方法 经验变得比较重要 而且芯片集成度越来越高 基本上再去研究的人就少了 经典
  • 1024 CodeGenerator

    答 水一下 CodeGenerator package com example springtest author LeCodeYang version 1 0 description TODO date 2022 7 11 15 22 i
  • Spring集成log4j,日志初始化过程详解

    以前研究过slf4j log4j的使用 但具体初始化过程不是很清楚 今天闲下来 翻了一下源码 一探究竟 日志组件介绍 url http www blogjava net daiyongzhi archive 2014 04 13 41236
  • Shell脚本定时清理Postgres数据库中历史数据

    Shell脚本定时清理Postgres数据库中历史数据 在系统日常运行中 会产生大量的日志 日志表会越来越加庞大 特别是对于云服务器使用者来说 每一块的空间都是很宝贵的 所以定时清理掉无用的历史日志 就显得很有意义了 其实实现数据库的日志清
  • 类的继承层次结构的宽度和深度

    最近在项目开发中 各位兄弟对于现有的架构有所诟病 主要是继承的问题 层次比较深 层次之间没有很明确的功能划分 造成一定的混乱 我来承担工作 想出一套新的方案 满足大家平时开发的需求 先总结下现在项目的问题 一个是层次深 一个是抽象的不好 大
  • linux16.04 从零开始搭建maskrcnn (!!亲测有效!!)

    文章参考 https github com pytorch vision blob temp tutorial tutorials torchvision finetuning instance segmentation ipynb 环境搭
  • STL源码分析:空间配置器浅析

    目录 allocator alloc 一级配置器 二级配置器 自由链表 内存分配allocate S refill函数 S chunk alloc函数 内存释放deallocate 为什么要使用free list 为什么free list要
  • Java-spring数据库编程(idea)实现学生账号登录以及管理员增删改查功能

    通过所学的Spring数据库编程知识 实现学生管理系统的登录及增删改查的功能 要求学生在控制台输入用户名密码 如果用户账号密码正确则显示登录成功 如果登录失败则显示登录失败 登录成功后 可以进行增删改的功能 思路分析 根据学生管理系统及其登
  • 【数据结构详细学习笔记2】单链表的定义和表示

    目录 1 单链表基础知识 1 1线性表链式存储结构的特点 1 2 与链式存储有关的术语 1 3链表的类型 1 4表示空表 1 5设置头结点的好处 2 单链表代码实现 附源码 3 实现单链表遇到问题 1 单链表基础知识 1 1线性表链式存储结
  • matlab 算法集锦

    算法集锦 决策树 划分点 function n h huafendian1 x n返回增益 h返回划分点 假设0代表第一类 假设1代表第二类 输入x第一列为属性 第二列为用于学习的分类结果 m sort x 1 按小到大排序 x x m t
  • Guava 之 Multimap

    Multimap 是 guava 包下的一个接口 是一个 key collection 类型的集合 Multimap 接口方法 GwtCompatible public interface Multimap
  • Git rebase变基操作

    先讲个例子理解一下什么是变基 A B C dev D E F G master 两个分支master dev 其中dev分支是在master分支上的提交点E拉出的分支 在两个分支合并之前 master分支有了新的提交F G 此时想在gitl
  • C的泛型编程

    C的泛型编程 C语言支持泛型编程吗 Generic关键字 泛型算法 C99的tgmath h void 指针 总结 泛型编程 generic programming 是程序设计语言的一种风格或范式 泛型允许程序员在强类型程序设计语言中编写代
  • RocketMQ经典高频面试题大全(附答案)

    编程界的小学生 0 彩蛋 1 说说你们公司线上生产环境用的是什么消息中间件 2 多个mq如何选型 3 为什么要使用MQ 4 RocketMQ由哪些角色组成 每个角色作用和特点是什么 5 RocketMQ中的Topic和JMS的queue有什
  • AQS(AbstractQueuedSynchronizer)阻塞队列

    AQS 队列同步器是用来构建锁或其他同步组件的基础框架 它使用一个 volatile int state 变量作为共享资源 如果线程获取资源失败 则进入同步队列等待 如果获取成功就执行临界区代码 释放资源时会通知同步队列中的等待线程 同步器
  • PyTorch YOLOv8入门解读与Python实现

    PyTorch YOLOv8入门解读与Python实现 YOLOv8是一种基于PyTorch框架实现的目标检测算法 它能够快速准确地检测图像中的多个目标 本文将详细解读YOLOv8的原理 并提供相应的Python代码实现 YOLOv8简介
  • Oracle--初学小白基础篇(第一版)

    文章目录 一 Oracle11g介绍 1 Oracle11g安装和卸载 Oracle11g安装 Oracle11g卸载 1 使用Oracle Universal Installer管理工具卸载 2 使用 deinstall bat 批处理文
  • Redis事务、持久化、发布订阅

    文章目录 Redis事务 Redis持久化 RDB Redis DataBase 快照方式 AOF Append Only File 日志形式 Redis发布订阅 发布订阅模型 实例 Redis发布订阅命令 原理 Redis事务 Redis
  • flutter 字符串的常用属性及方法

    1 字符串长度 var str 字符串的长度 print 打印 str length 打印 6 var str1 hello dart print 打印 str1 length 打印 10 2 是否为空 str isEmpty为空true
  • 关于ElasticSearch的Update By Query的那些著名的坑

    提起es的Update By Query很多人一定也不陌生 它对应的就是关系型数据库的update set where 语句 这对应一般的存储引擎而言算是最基本的功能 但它的坑确不少 多到让你使用起来很奔溃 比如批量更新时非事务模式执行 允