Elasticsearch中的版本號version和序列號seq_no的相關問題


今天想看一下版本號與序列號是如何變化的問題

官方文檔的解釋為:

_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 並且文檔會記錄是第幾次操作使它成為現在的情況的

以上就是我對於版本號以及序列號變化原因的思考過程,歡迎斧正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM