一个小小酥

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

今天想看一下版本号与序列号是如何变化的问题

官方文档的解释为:

_version

(integer) The document version associated with the operation. The document version is incremented each time the document is updated.

This parameter is only returned for successful actions.

_seq_no

(integer) The sequence number assigned to the document for the operation. Sequence numbers are used to ensure an older version of a document doesn’t overwrite a newer version. See Optimistic concurrency control.

This parameter is only returned for successful operations.

首先创建一个索引

PUT /lts 
{
  "mappings": {
    "properties": {
      "content":{"type": "text"},
      "tags":{"type": "long"}
    }
  }
}

插入数据如下

PUT /lts/_doc/1
{
  "content": "123",
  "tags": 1
}
#结果为
"_version" : 1 "_seq_no" : 0
PUT /lts/_doc/2
{
  "content": "111",
  "tags": 2
}
#结果为
"_version" : 1 "_seq_no" : 1
PUT /lts/_doc/3
{
  "content": "321",
  "tags": 3
}
#结果为
"_version" : 1 "_seq_no" : 2

用POST更新第一个文档的数据

POST /lts/_update/1/
{
  "doc":{
    "content": "12345"
  }
}
#结果为
"_version" : 2 "_seq_no" : 3

用PUT覆盖插入第二个文档 但内容有所变化

PUT /lts/_doc/2
{
  "content": "222",
  "tags": 2
}
#结果为
"_version" : 2 "_seq_no" : 4

再试试PUT覆盖插入第二个文档  但内容没有变化

PUT /lts/_doc/2
{
  "content": "222",
  "tags": 2
}
#结果为
"_version" : 3 "_seq_no" : 5

再来用POST更新方法传递内容不变的数据

POST /lts/_update/1/
{
  "doc":{
    "content": "12345"
  }
}

#结果为"result" : "noop"无操作  "_version" : 2    "_seq_no" : 3

这和上面第一个文档操作后的版本号和序列号是相同的

此时我发现:文档之间似乎是相互独立的关系

难道是因为无操作才会这样吗 更新第一个文档 用不一样的数据试试

#我预计结果为  "_version" : 3     "_seq_no" : 4
POST /lts/_update/1/
{
  "doc":{
    "content": "54321"
  }
}

#实际结果为  "_version" : 3     "_seq_no" : 6

看样子序列号是有操作就会加1的

再次更新第一个文档

POST /lts/_update/1/
{
  "doc":{
    "content": "543"
  }
}

#结果为  "_version" : 4     "_seq_no" : 7

版本号和序列号都加1  这好像明白了点什么

通过观察我发现 每次成功操作后 序列号都成功增加了1

那说明 是不是可以理解为:序列号是整个索引的信息  而版本号则是每个文档的信息 我们来验证一下

GET /lts/_doc/2

此时我预测结果为  "_version" : 3     "_seq_no" : 7

结果为  "_version" : 3     "_seq_no" : 5     这和我预料的并不一样啊

再看看第三个文档的信息  我们还记得插入时为  "_version" : 1    "_seq_no" : 2

GET /lts/_doc/3

那我预测信息不变 运行看一下结果

这次我的预测是正确的了

现在插入第四个文档 来证明我的猜想 :我预计结果为 "_version" : 1 "_seq_no" : 8

有点小紧张

PUT /lts/_doc/4
{
  "content": "666",
  "tags": 4
}

结果为 "_version" : 1 "_seq_no" : 8  我的预测没有错

为了保守起见 确认一下前面的版本和序列信息都没有变化

GET /lts/_doc/1
GET /lts/_doc/2
GET /lts/_doc/3
GET /lts/_doc/4

最后得出结论 :每个文档的版本号"_version" 起始值都为1 每次对当前文档成功操作后都加1

而序列号"_seq_no"则可以看做是索引的信息 在第一次为索引插入数据时为0 每对索引内数据操作成功一次加1 并且文档会记录是第几次操作使它成为现在的情况的

以上就是我对于版本号以及序列号变化原因的思考过程,欢迎斧正。

posted on 2020-07-22 21:05  一个小小酥  阅读(2404)  评论(1编辑  收藏  举报