开发者学堂课程【ElasticSearch 最新快速入门教程: ES 版本控制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/642/detail/10612
ES 版本控制
内容介绍:
一、讲义
二、演示
一、讲义
ES 版本控制
普通关系型数据库使用的是(悲观并发控制( PCC ) )
当我们在读取一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据
ES 使用的是(乐观并发控制(OCC ) )
ES 不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取新数据来进行更新,又或者将这一情况直接反馈给用户。
ES 如何实现版本控制(使用 es 内部版本号)
1:首先得到需要修改的文档,获取版本(version)号
curl -XGET http://localhost:9200/bigdata/product/1
2:再执行更新操作的时候把版本号传过去
curl-XPUT http://localhost:9200/bigdata/product/1?version=1 -d'{"name":"hadoop" "version":3}’(覆盖)
curl-XPOST http://localhost:9200/bigdata/product/1/update?version=3 -d '{"doc”:{"name":"apache hadoop" ,"latest_version": 2.6}}"(部分更新)
3:如果传递的版本号和待更新的文档的版本号不一致,则会更新失败
ES 如何实现版本控制(使用外部版本号)
如果你的数据库已经存在了版本号,或者是可以代表版本的时间戳。这时就可以在 es 的查询 url 后面添加version_type=external来使用这些号码。
注意︰
版本号码必须要是大于0小于9223372036854775807 ( Java 中 long 的最大正值)的整数。
es 在处理外部版本号的时候,它不再检盘 ersion 是否与请求中指定的数值是否相等,而是检查当前的 version 是否比指定的数值小,如果小,则请求成功。
example :
curl-XPUT 'http://localhost:9200/bigdata/product/20?version=10&version_type=external’ -d ‘{“name”: “flink”}’
注意:
此处 url 前后的引号不能省略,否则执行的时候会报错
二、演示
输入
curl-XGET ‘http://JANSON01:9200/bigdata/product/_search?pretty’
再来输入
curl-XGET ‘http://JANSON01:9200/bigdata/product/HM9rL2oB300nRXZV6BRB?pretty’
显示查询出的版本号为2
再来进行更新操作,输入
curl -H ‘Content-Type:application/json’ -XPOST ‘Http://JANSON01:9200/bigdata/product/HM9rL2oB300nRXZV6BRB/_updata?pretty&_version=2’ -d ‘{“doc”:{“author”: “楚留香”}}’
结果报错
再来修改为
curl -H ‘Content-Type:application/json’ -XPOST ‘Http://JANSON01:9200/bigdata/product/HM9rL2oB300nRXZV6BRB/_updata?version=2&pretty’ -d ‘{“doc”:{“author”: “楚留香”}}’
结果显示成功
{
"_index" : "bigdata",
"_type" : "product",
"_id" : “HM9rL2oB300nRXZV6BRB",
"_version" : 3,
"result" : "updated",
" _shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 6,
"_primary_term" : 2
}