es文档版本控制

简介: es文档版本控制如何实现?

GET test1/_doc/1可以获取如下信息:

"_index" : "test1",
"_type" : "_doc",
"_id" : "1",
"_version" : 5,
"_seq_no" : 20797327,
"_primary_term" : 2,
"found" : true,
...
_version:文档版本,每次更新文档时递增。
_seq_no:配置给文档的序列号用来进行索引操作,用于确保文档的旧版本不会覆盖新版本。
_primary_term:配置给文档的主term用来进行索引操作。

索引文档可以通过if_seq_noif_primary_term参数进行当前文档版本的判断,如指定参数和当前文档版本一致则满足索引条件修改文档并且seq_no增加一,则会抛出VersionConflictException409

通过使用_create或者将op_type设置为create(默认为index)可实现仅索引不存在的文档(通过id辨别)。

版本控制:

每个文档都有一个版本号。默认的内置版本号从1开始每次更新或删除的时候递增(_primary_term默认1,_version_seq_no随更新删除同步递增)。也可以将版本号设置为外部值(数据库中维护),设置version_typeexternal开启,数值型,值必须大于等于0小于9.2e+18。
使用外部类型时,系统会检查传递给索引请求的版本号是否大于当前存储文档的版本。如果为 true,则文档将被索引并使用新版本号;如果提供的值小于或等于存储文档的版本号,则会发生版本冲突,索引操作将失败(409)。例如:

PUT my-index-000001/_doc/1?version=2&version_type=external
{
  "user": {
    "id": "elkbee"
  }
}

版本类型version_type:

internal:通过if_seq_no和if_primary_term控制,判断相等才索引
external:通过version判断,大于或者不存在才索引
external_gte:通过version判断,大于等于或不存在才索引

乐观锁控制并发:

es是分布式的,当文档创建、更新或者删除时,必须将文档新的版本号复制到集群其他节点。es也是异步并发的,这意味着这些复制请求并行发送,并可能会乱序到达目标节点。es需要一种方法来保证文档的就把按本不会覆盖新版本。
为了确保文档的旧版本不会覆盖新版本,对文档的每个操作都会由执行该操作的主分片分配一个序列号(_seq_no)。每次操作都会增加序列号,因此可以保证新操作比旧操作具有更高的序列号。这样es可以通过操作的_seq_no确保新的文档版本永远不会被分配了较小序列号的更改覆盖。
在PUT数据是会生成初始的_seq_no_primary_term:_seq_no针对索引级别,不同文档id的_seq_no会和并累加计算。

POST caster/_doc/2
{
  "name":"2"
}

{
  "_index" : "caster",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 6,
  "_primary_term" : 1
}

Get API可以直接获取_seq_no_primary_term,Search API需要指定seq_no_primary_term参数显示他们。
_seq_no_primary_term唯一地标识更改。通过记录返回的_seq_no和_primary_term,您可以确保仅在检索后没有对其进行其他更改的情况下才更改文档。通过设置index、update 或delete API的if_seq_noif_primary_term参数来完成的。

version和seq_no&primary_term的区别:
version应用于外部即version_type=external时进行控制;
新版本使用seq_no&primary_term应用于es内部自己版本控制时使用。

primary_term的意义:
在shard节点间迁移,修改副本数等情况均未发生改变。
重新分配选举主shard或者主shard宕机副本上位时多个文档_seq_no一样等异常时起作用。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
人工智能 Java 关系型数据库
分享66个JavaGame源码总有一个是你想要的
分享66个JavaGame源码总有一个是你想要的
1551 0
|
Ubuntu 开发工具 C语言
Ubuntu环境下的Samba源码编译
以上就是在Ubuntu环境下编译Samba源码的步骤。希望这个指南能帮助你成功地从源码编译Samba。如果你在编译过程中遇到任何问题,你可以查阅Samba的官方文档,或者在网上搜索相关的教程和解决方案。
393 23
|
存储 缓存 监控
极致 ElasticSearch 调优,让你的ES 狂飙100倍!
尼恩分享了一篇关于提升Elasticsearch集群的整体性能和稳定性措施的文章。他从硬件、系统、JVM、集群、索引和查询等多个层面对ES的性能优化进行分析,帮助读者提升技术水平。
|
NoSQL 负载均衡
【Cassandra】Cassandra集群管理节点
The Apache Cassandra database is the right choice when you need scalability and high availability without compromising performance. Linear scalability and proven fault-tolerance on commodity hardware or cloud infrastructure make it the perfect platform for mission-critical data.
1224 0
|
机器学习/深度学习 人工智能 TensorFlow
利用AI技术实现智能垃圾分类
【8月更文挑战第67天】随着人工智能技术的不断发展,越来越多的应用场景开始涌现。本文将介绍如何利用AI技术实现智能垃圾分类,通过代码示例和实际应用案例,帮助读者了解AI技术在垃圾分类领域的应用价值和潜力。
1153 19
|
JavaScript 数据安全/隐私保护 开发者
开源图片编辑器推荐-可用于海报编辑、商品设计、封面设计、标签设计等场景
推荐开源图片编辑器,基于fabric.js和Vue开发,适合海报、Logo等设计场景。拥有4.4K GitHub Stars,特性包括自定义字体、素材、模板,支持插件扩展、右键菜单及快捷键。提供图片滤镜、裁剪、拖拽、PSD导入、水印设置和分类素材管理。适用于非专业设计者,易于二次开发。
650 0
开源图片编辑器推荐-可用于海报编辑、商品设计、封面设计、标签设计等场景
|
NoSQL 测试技术 MongoDB
使用同步和异步方式更新插入MongoDB数据的性能对比
在这篇文章中,我将探讨如何使用同步和异步方式插入数据到MongoDB,并对两种方式的性能进行对比。并将通过Python中的 pymongo 和 motor 库分别实现同步和异步的数据插入,并进行测试和分析。
|
存储 SQL 运维
OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析
OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析
|
IDE 算法 中间件
初识REDHAWK
初识REDHAWK
707 2
|
容器 API UED
【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)
【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)
576 0
【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)

热门文章

最新文章

下一篇
开通oss服务