es文档版本控制

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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一样等异常时起作用。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
7月前
|
人工智能 缓存 开发工具
结合企业实践来规范你的Git commit(含插件使用指南)
结合企业实践来规范你的Git commit(含插件使用指南)
结合企业实践来规范你的Git commit(含插件使用指南)
|
JavaScript IDE 前端开发
如何在大型代码仓库中删掉废弃的文件和 exports?
本文是我最近在公司内部写的废弃代码删除工具的一篇思考总结。
|
7月前
|
存储 开发工具 数据安全/隐私保护
版本控制:让你的代码有迹可循
版本控制:让你的代码有迹可循
|
存储 机器学习/深度学习 数据采集
基于ES在慢病项目中的应用
ES在慢性病管理项目中的应用
257 29
ES文档写入原理
ES文档写入原理
99 0
ES文档写入原理
|
安全 IDE 网络协议
【Git】版本控制之基础用法
进公司毕竟是多人协作的事情,不是你一个人在更改代码,所以必须要会代码管理工具来多人管理代码。(如果一个人干所有人的活当我没说) 作为2023年代码管理工作最为出名的分布式那肯定还是Git。 当然也有其他的,比如SVN等等。 这篇主要讲解的是Git的使用。
106 0
|
JavaScript 开发工具 git
规范(二):版本规范和 Changelog
规范(二):版本规范和 Changelog
规范(二):版本规范和 Changelog
|
存储 机器学习/深度学习 缓存
快速入门DVC(三):数据与模型版本管理
数据和模型版本控制是 DVC 的基础层用于管理大型文件、数据集和机器学习模型。使用常规的 Git 工作流程,但不要在 Git 库中存储大文件。 大数据文件单独存储,来实现高效共享。想象一下,让 Git 以与处理小代码文件相同的性能来处理任意大的文件和目录,该有多酷?例
|
存储 机器学习/深度学习 缓存
DVC 使用案例(一):数据与模型版本管理
数据科学团队常常面临着数据和机器学习模型进行版本化的数据管理问题。我们应该如何一起跟踪数据、源代码和ML模型中的变化?组织和存储这些文件和目录变更的最佳方式是什么?
|
JSON 分布式计算 Hadoop
ES 版本控制|学习笔记
快速学习 ES 版本控制。
120 0

热门文章

最新文章