今天想看一下版本号与序列号是如何变化的问题
官方文档的解释为:
_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 并且文档会记录是第几次操作使它成为现在的情况的
以上就是我对于版本号以及序列号变化原因的思考过程,欢迎斧正。