iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Software Development

由淺入深來探討Elasticsearch,從基礎語法到底層相關原理系列 第 5

【Day 5】由淺入深來探討Elasticsearch - Index與Document的基礎語法

  • 分享至 

  • xImage
  •  

今天來介紹Index與Document的基礎語法:
Elasticsearch的API被設計成RESTful風格的HTTP API,代表我們在使用API最開頭的單字就是GET、POST、PUT與DELETE。而內部一樣是接JSON格式的資訊

Index基本操作

創建

// PUT 然後接索引名稱 設置部分先只需設定primary與replica shard的數量
PUT /test1 
{
  "settings":{
    "number_of_shards": 1, 
    "number_of_replicas": 1
  }
}

https://ithelp.ithome.com.tw/upload/images/20230907/20161866nlWvO0RsXy.png

  • acknowledged代表是否成功建立索引
  • shards_acknowledged代表是否在超時之前創建運行索引必要的分片(默認primary shard)

此時我們可以回想起之前說的,replica shard跟primary shard無法在同一個node上,那我們這時候去看

GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason

https://ithelp.ithome.com.tw/upload/images/20230907/20161866GUTq9bCnDK.png
可以看到replica shard沒有被分配到node中,這樣會導致叢集健康是黃色的,因為沒有node可以分配,並且也失去頂替primary shard的功能,所以我們這邊可以直接刪除索引

刪除

// DELETE 然後接索引名稱
DELETE /index_name 

刪除好後,我們再重新創一個索引來方便我們操作接下來的文檔部分

PUT /product
{
  "settings": {
    "number_of_replicas": 0
  }
}

Document基本操作

新增

// 第一種:POST /索引名稱/_doc 底下欄位就自訂,隨便都可以
POST /product/_doc
{
  "name": "coffee",
  "price": 100,
  "stocks": 10
}

// 第二種:PUT /索引名稱/_doc/id名(可自己定)
PUT /product/_doc/2
{
  "name": "tea",
  "price": 80,
  "stocks": 10
}

https://ithelp.ithome.com.tw/upload/images/20230907/201618662SeGOgN5w7.png

這邊解釋一下結果中各項參數的意思

名稱 含義
_index 代表文檔存入的索引名稱
_id 每個文檔在索引中的唯一ID,可以用來檢索,更新或是刪除文檔。通常可以直接使用ES預設的id就好
_version 表示當前文檔的版本,被修改時會增加,可以用來避免資料衝突
result 可以分成created、updated 與deleted
_shards 其中total是涉及到的總分片數,而剩下就是成功與失敗的個數。因為這邊只有primary shard所以是1
_seq_no 代表文檔的序列號碼,可以用於實現樂觀索
_primary_term 如果primary shard被更換時會發生改變

而獲取剛剛的文檔就可以使用GET

GET /product/_doc/2

https://ithelp.ithome.com.tw/upload/images/20230907/201618664YT6NDCGUX.png
其中的_source代表原始的JSON數據,一般情況下是與實際數據沒有區別的

更新特定文檔

POST /product/_update/2
{
  "doc": {
    "stocks": 10
 }
}

https://ithelp.ithome.com.tw/upload/images/20230907/20161866ZQeagA2ceK.png
我們可以看到版本與seq_no都+1 並且result也是updated

甚至我們也可以直接新增同一個文檔其他的欄位

// POST /索引名稱/_update/id
POST /product/_update/2
{
  "doc": {
    "sell": 2
  }
}

// 也能用PUT
PUT /product/_doc/2
{
  "doc": {
    "sell": 1
  }
}

https://ithelp.ithome.com.tw/upload/images/20230907/20161866twetGNcOmq.png
當然,前面有提到segment file是唯讀,因此這邊使用update API是先刪掉舊文檔,再創建新的

刪除特定文檔

DELETE /product/_doc/2

這邊對primary terms跟sequence numbers再延伸一下

  • 前面提到primary terms用來分辨舊與新的primary shards,並且記錄primary shard毀損的次數,在進行操作時,除了primary terms之外,seq number也會隨之紀錄。
  • sequence numbers是用來記錄每一次操作,一次操作primary shard就幫忙加一然後再進行操作,直到這個primary shard被進行替換。
  • 上述的東西可以幫助ES更有效率的修復資料,但是如果是相當大的索引的話,這樣過程需要花費的成本也很高。使用global跟local的checkpoint可以幫助加速這個過程,基本上這兩者都是sequence numbers,而global是對應replication group(包含primary跟所有replica),local則是對應replica shard,這樣如果有shard壞掉時就能馬上用checkpoint來分割時間軸,不用再多花資源去尋找。更詳細的解釋會在之後的章節補上

version補充
version是幫助樂觀鎖的建立,例如說A跟B都獲得了產品的資料,但是如果A先修改產品資料但是此時B不知道,那這時B去修改可能就會造成錯誤,version就是要改善這個狀況

使用方式:
先獲取該文檔的primary term跟seq no,然後下post指令

POST /products/_update/100?if_primary_term=1&if_seq_no=11

所以如果是用舊的seq no就造成失敗,也能因此知道有人在過程中對文檔進行修改

最後可能會有人有疑問,前面提過每一個文檔是存在特定的primary shard,那ES要怎麼知道去要把文檔創建在哪個分片中,以及要刪除或是更新資料時又要去哪個shard中去找?這部分就會明天揭曉啦~


上一篇
【Day 4】由淺入深來探討Elasticsearch - 快速啟動ES環境
下一篇
【Day 6】由淺入深來探討Elasticsearch - Routing
系列文
由淺入深來探討Elasticsearch,從基礎語法到底層相關原理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言