今天想看一下版本號與序列號是如何變化的問題
官方文檔的解釋為:
_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 並且文檔會記錄是第幾次操作使它成為現在的情況的
以上就是我對於版本號以及序列號變化原因的思考過程,歡迎斧正。