iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Software Development

30 天學習 Elasticsearch系列 第 10

Day 10 Elasticsearch - Index & Document 的 CRUD

  • 分享至 

  • xImage
  •  

該文章同步發佈於:我的部落格

也歡迎關注我的 Facebook 以及 Instagram 接收軟體相關的資訊!

上一篇文章 中,我們已經對於 Elasticsearch ( 以下簡稱 ES ) 的基本設定有了概念,設定也知道如何建立 index 了。

接著就示範一次 Index 的 CRUD 吧!

建立 index 時加入設定

在 Dev tools 中使用 PUT /users 就可以簡單地建立 index ,但這邊想要加入一些設定,我們希望 index 在一開始建立時就有 2 個 primary shards 以及 2 個 replica shard。

如上圖所示,只需要在 PUT 的動作中加入 payload 即可:

{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 2
  }
}

至於如何確認 shard 是否有建立或成功地被 STARTED 前幾篇文章都有提過。

刪除 index

ES 本身的設計就是 REST API 的風格,所以可想而知刪除一個 index 就是 DELETE /users 這麼簡單而已。

來 index 一個文件

終於,我們要寫入資料到 index 內了,現在 users index 中還是空蕩蕩的,馬上來建立一個 document,同理,當我們要建立一個 document 時,使用的是 POST 這個 HTTP 動詞。

使用 /users/_doc 的 endpoint 接著配上想要新增的內容:

{
  "name": "robert",
  "age": 27,
  "gender": "male"
}

接著看一下回應:

旁邊有兩個資訊很有趣,一個是 _id 另外一個則是 _shards

_id 是由 ES 自動產生的 hash,我們也可以自己來設定 _id,等等會做示範。

_shards 則是顯示出了這個 document 被存放到幾個 shard 之中,為什麼是 3 呢?

還記得我們建立這個 index 時,特別設定了 primary shard 為 2 以及 replica shard 也為 2。

所以回想一下 primary shard 的用意,是將資料分割,而 replica 則是複製 primary shard,所以這時候我們將資料寫入了 1 個 primary shard 並複製到 2 個 replica shards,所以才會是 3。

替 document 設定 _id

如何替 document 設定 _id 呢?換個角度想,在 REST API 的風格中,針對某一個特定的資源進行更新,我們會使用 PUT,所以可以寫成這樣:

PUT /users/_doc/1,結果如下:

ES 的 auto_create_index 機制

其實 ES 有預設的機制,當我們在建立叢集時可以設定一個叫做 auto_create_index 的值,預設是 true,效果就是直接寫入 document 會幫你自動建立 index,這點和關聯式資料庫很不一樣,我們需要先建立資料表,才能寫入資料。

所以我們可以直接 POST /character/_doc 搭配 payload:

{
  "name": "ruffy"
}

就會自動建立 shards 以及寫入 document:

讀取 document

聰明如你,要怎麼讀取 document 的方式,應該是不需要示範,只要使用 GET /users/_doc/1 就可以讀取到我剛剛寫入的資料了。

更新 document

如何更新 document 呢?使用 POST 搭配 /index_name/_update/:id 的 endpoint 去更新某一個 document,我們試著把剛剛 _id=1 的 document 更新年紀。

甚至要新增欄位,也是使用相同的 API:

至於為什麼要使用 POST 呢?POST 不都是用在於建立新的資源嗎?

其實這麼想是正確的喔!因為 ES 內的 documents 都是不可變的,所以可以想像成我們確實是在建立新的資源沒錯。

不可變?但剛剛我們才更新了兩次 document,怎麼會是不可變呢?

ES 是採用取代的方式,而不是使用更新舊有資料的方式來達到更新,至於 ES 如何做到的?這之後會特別提到,但主要的關鍵字就是 immutable segment 以及標記 deletedversion 這幾個關鍵字。


上一篇
Day 09 Elasticsearch - 在叢集中加入新的節點
下一篇
Day 11 Elasticsearch - 使用 Script 來更新欄位
系列文
30 天學習 Elasticsearch30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言