【Elasticsearch】更新操作原理

Elasticsearch 的更新操作(如 `_update` 和 `_update_by_query`)在底层实现上有一些复杂的原理,这些原理涉及到 Elasticsearch 的数据存储机制、索引机制以及事务日志(Translog)的使用。以下是 Elasticsearch 更新操作的主要原理:

1. 文档的存储和索引

在 Elasticsearch 中,文档是以 JSON 格式存储的,并且每个文档都有一个唯一的 `_id`。这些文档被存储在索引中,索引由多个分片(Shards)组成,每个分片是一个独立的 Lucene 索引。

2. 更新操作的基本流程

当执行更新操作时,Elasticsearch 会按照以下步骤处理:

a. 查找文档

- Elasticsearch 首先根据提供的 `_id` 在索引中查找目标文档。

- 如果文档不存在,更新操作的行为取决于是否设置了 `doc_as_upsert` 参数:

  - 如果设置了 `doc_as_upsert`,则会插入一个新的文档。

  - 如果没有设置 `doc_as_upsert`,则更新操作会失败。

b. 读取旧文档

- 如果文档存在,Elasticsearch 会读取旧文档的内容。

c. 应用更新

- Elasticsearch 将更新内容(如通过 `_update` API 提供的 `doc` 部分)应用到旧文档上。

- 如果是部分更新(如 `_update`),Elasticsearch 会将新的字段值合并到旧文档中。

- 如果是全量替换(如 `PUT`),Elasticsearch 会用新的 JSON 数据完全替换旧文档。

d. 写入新文档

- 更新后的文档会被重新索引,生成一个新的 Lucene segment。

- 旧文档会被标记为删除(但不会立即从磁盘中删除)。

e. 事务日志(Translog)

- 更新操作会被记录在事务日志(Translog)中,以确保操作的持久性。

- 事务日志是一个持久化的日志文件,用于记录所有对索引的写操作(包括插入、更新和删除)。

f. 刷新和提交

- 当事务日志达到一定大小或时间间隔时,Elasticsearch 会执行 `_flush` 操作:

  - 将内存中的数据和事务日志中的操作持久化到磁盘。

  - 清空事务日志。

- 在 `_flush` 操作之前,Elasticsearch 会先执行 `_refresh` 操作,确保数据在文件系统缓存中可用,从而可以被搜索到。

3. 并发控制

Elasticsearch 使用乐观并发控制机制来处理并发更新:

- 每个文档都有一个序列号(`seq_no`)和一个主版本号(`primary_term`)。

- 在更新操作时,可以指定 `if_seq_no` 和 `if_primary_term` 参数,以确保只有在文档的序列号和主版本号匹配时才执行更新。

- 如果序列号或主版本号不匹配,更新操作会失败,从而避免覆盖其他用户的更改。

4. 批量更新

对于批量更新操作(如 `_update_by_query`),Elasticsearch 会按照以下步骤处理:

- 执行查询,找到需要更新的文档集合。

- 对每个文档应用更新逻辑。

- 逐个更新文档,每个文档的更新过程与单个文档更新类似。

- `_update_by_query` 操作会使用内部的重试机制来处理并发冲突。

5. 性能优化

- 内存管理:Elasticsearch 会将更新操作的结果暂存到内存中,以提高性能。

- 批量处理:对于批量更新操作,Elasticsearch 会尽量减少对磁盘的写入次数,通过批量处理来优化性能。

- 异步处理:某些更新操作(如 `_flush` 和 `_refresh`)是异步执行的,以减少对请求的阻塞。

总结

Elasticsearch 的更新操作涉及多个步骤,包括查找文档、读取旧文档、应用更新、写入新文档、记录事务日志、刷新和提交等。通过这些机制,Elasticsearch 确保了更新操作的高效性、一致性和持久性。同时,通过乐观并发控制机制,Elasticsearch 能够有效处理并发更新,避免数据冲突。

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

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

相关文章

【C++】红黑树的实现

目录 前言 一、红黑树的概念 二、红黑树的实现 三、红黑树的查找 四、红黑树的验证 五、红黑树的删除 总结 前言 本文讲解红黑树,主要讲解插入部分的实现,建议在理解了AVL树的旋转后再来学习红黑树,因为红黑树也涉及旋转,并…

IPv4地址的主要配置项介绍

1. IPv4 主要配置项 (1) IP 地址(IP Address) 作用:唯一标识网络中的设备(如 192.168.1.100)。分类: 静态 IP:手动配置,适用于服务器、打印机等固定设备。动态 IP(DHCP…

nginx 基于IP和用户的访问

nginx的下载 yum install nginx.x86_64 -y 启动服务 systemctl enable --now nginx.service 查看服务目录 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…

Debian操作系统全面解析:从起源到应用

Debian 操作系统全面解析:从起源到应用 在开源操作系统的广袤天地中,Debian 占据着极为重要的地位。它凭借自身诸多突出特性,吸引了全球无数用户与开发者的目光,从个人桌面应用到大型服务器部署,从普通办公场景到专业科研领域,Debian 都展现出了强大的适应性与可靠性,为…

【springMVC】springMVC学习系列一:springMVC的组件

系列文章目录 前言 spring mvc 它解决了什么问题呢? 1.URL映射 2. 表单参数映射 3. 调用目标Control 4. 数据模型映射 5. 视图解析 6. 异常处理 上述解决在spring mvc 中都体现在如下组件当中 HandlerMapping: url与控制器的映谢 HandlerAdapter&#…

【Vue Vapor Mode :技术突破与性能优化的可能性】

Vue Vapor Mode :技术突破与性能优化的可能性 前言 作为一名有着Vue 2经验和Vue 3经验的开发者,你一定深刻体会过Vue从Options API到Composition API的演进,也感受过Vue 3在性能上相比Vue 2的显著提升。现在,Vue团队正在开发一个…

MySQL数据库零基础入门教程:从安装配置到数据查询全掌握【MySQL系列】

第1章:认识MySQL 1.1 什么是MySQL? MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现由Oracle公司维护。它使用结构化查询语言(SQL)进行数据库的管理和操…

AXI3、AXI4 和 AXI5 的详细差异对比

AXI3、AXI4 和 AXI5 的详细差异对比 摘要:AXI (Advanced eXtensible Interface) 是 ARM 公司提出的高性能片上总线协议,广泛用于 SoC (System on Chip) 设计中,以实现高效的数据传输和系统互连。AXI 协议随着版本的迭代不断演进,从…

向量数据库该如何选择?Milvus 、ES、OpenSearch 快速对比:向量搜索能力与智能检索引擎的应用前景

​ 1.milvus VS ES Milvus 的亮点 功能性:Milvus 不仅支持基本的向量相似性搜索,还支持稀疏向量、批量向量、过滤搜索和混合搜索功能等高级功能。 灵活性:Milvus 支持多种部署模式和多个 SDK,所有这些都在一个强大的集成生态系…

SQL进阶之旅 Day 4:子查询与临时表优化

文章标题 【SQL进阶之旅 Day 4】子查询与临时表优化 文章内容 开篇:SQL进阶之旅的第4天 在“SQL进阶之旅”系列中,第4天的主题是子查询与临时表优化。这是SQL开发中不可或缺的一部分,尤其在处理复杂查询时,合理使用子查询和临…

Python学习(2) ----- Python的类型

在 Python 中,一切皆对象,每个对象都有类型。下面是 Python 中的常见内置类型分类和示例: 🟡 1. 数字类型(Numeric Types) 类型说明示例int整数5, -42float浮点数3.14, -0.5complex复数1 2j a 10 …

跨协议协同智造新实践:DeviceNet-EtherCAT网关驱动汽车焊接装配效能跃迁

在汽车制造领域,机器人协作对于提升生产效率与产品质量至关重要。焊接、装配等关键环节,需要机器人与各类设备紧密配合。JH-DVN-ECT疆鸿智能的devicenet从站转ethercat主站协议网关,成为实现这一高效协作的得力助手,尤其是在连接欧…

nginx之proxy_buffering的作用

Nginx 的缓冲机制是为了让后端能更快释放资源,而不是卡在慢客户端上,从而提升整体性能和并发能力。 现实中客户端和后端服务器之间的传输速率可能差异很大。Nginx 的缓冲机制正是为了解决这个不匹配问题。 假设没有缓冲(即 proxy_buffering…

数据库相关问题

1.保留字 1.1错误案例(2025/5/27) 报错: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near condition, sell…

GO 语言进阶之 进程 OS与 编码,数据格式转换

更多个人笔记见: github个人笔记仓库 gitee 个人笔记仓库 个人学习,学习过程中还会不断补充~ (后续会更新在github上) 文章目录 进程信息OS操作基本例子 编码相关HASH 哈希Base64 encoding 基础64编码 数据格式转换和处…

如何用Spring Cache实现对Redis的抽象

我们在进行Java项目开发时候,经常会用到Redis缓存例如数据库里的一些信息、手机验证码之类的,正常写法就会像去连mysql一样,这种硬编码的方式肯定是非常不合适的。 Autowireprivate UserMapper userMapper;Autowireprivate StringCommand str…

CMake指令:file()

目录 1.简介 2.常用子命令(COMMAND) 2.1.COPY - 复制文件或目录 2.2.RENAME - 重命名文件或目录 2.3.REMOVE - 删除文件或目录 2.4.MAKE_DIRECTORY - 创建目录 2.5.READ - 读取文件内容 2.6.WRITE - 写入文件内容 2.7.GLOB - 按模式匹配文件 2…

使用VuePress开发日志

结合官方教程,补充一些细节。 快速上手 | VuePress中文文档 | VuePress中文网 VuePress使用步骤 创建并进入一个新目录 mkdir vuepress-starter && cd vuepress-starter使用你喜欢的包管理器进行初始化 yarn init # npm init将 VuePress 安装为本地依赖 …

随手记录7

2025年5月26日~2025年6月01日 周一:没做 周二:芹菜炒鸡蛋香肠 周三: 周四: 周五: 周六: 周日:

【无标题】使用JEasyOpc开发OPCDA采集中间件

使用JEasyOpc开发OPCDA采集中间件 1.JEasyOpc下载2.修改JEasyOpc源码及打包安装3.Pom 引入jeasy2.3.2.jar4.maven pom 配置打包5.cmd执行(手动指定 main主程序入口)6.EXE4J打包jar包,生成exe可执行文件 1.JEasyOpc下载 jeasyopc源码下载&…