🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Elasticsearch 是分布式的。当文档创建、更新或删除时, 新版本的文档必须复制到集群中的其他节点。 Elasticsearch 也是异步和并发的,这意味着这些复制请求被并行发送,并且到达目的地时也许顺序是乱的 。 Elasticsearch 需要一种方法确保文档的旧版本不会覆盖新的版本。 <br/> 当我们之前讨论 index的GET 和 delete 请求时,我们指出每个文档都有一个 `_version `(版本)号,当文档被修改时版本号递增。 Elasticsearch 使用这个 version 号来确保变更以正确顺序得到执行。如果旧版本的文档在新版本之后到达,它可以被简单的忽略。 <br/> 我们可以利用 version 号来确保应用中相互冲突的变更不会导致数据丢失。我们通过指定想要修改文档的 version 号来达到这个目的。 如果该版本不是当前版本号,我们的修改请求将会失败。 <br/> 老版本 es 使用 version,但是新版本不支持了,会报下面的错误,提示我们用 `if_seq_no`和 `if_primary_term`来代替。演示如下: **1. 新增一个文档** ```json PUT /shopping/_create/1001 { "title": "华为手机" } 得到的响应如下: { "_index" : "shopping", "_type" : "_doc", "_id" : "1001", "_version" : 1, # 版本号为1 "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, # _seq_no、_primary_term与乐观并发控制相关 "_primary_term" : 1 } ``` **2. 使用version更改文档会失败** 提示我们用 `if_seq_no`和 `if_primary_term`来代替。 ```json POST /shopping/_update/1001?version=1 { "doc": { "title": "华为手机123" } } 得到的响应如下: { "error" : { "root_cause" : [ { "type" : "action_request_validation_exception", "reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;" } ], "type" : "action_request_validation_exception", "reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;" }, "status" : 400 } ``` **3. 用 `if_seq_no`和 `if_primary_term`更改文档** ```json #if_seq_no=0和if_primary_term=1需要已经存在 #如为"_seq_no" : 0、"_primary_term" : 1 #每更新一次文档_seq_no就会增1 POST /shopping/_update/1001?if_seq_no=0&if_primary_term=1 { "doc": { "title": "华为手机123" } } 响应内容如下: { "_index" : "shopping", "_type" : "_doc", "_id" : "1001", "_version" : 2, # 版本号由1变更为2 "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, # 由0变更为1 "_primary_term" : 1 } ```