該文章同步發佈於:我的部落格
也歡迎關注我的 Facebook 以及 Instagram 接收軟體相關的資訊!
上一篇文章 中,我們已經對於 Elasticsearch ( 以下簡稱 ES ) 的基本設定有了概念,設定也知道如何建立 index 了。
接著就示範一次 Index 的 CRUD 吧!
在 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
前幾篇文章都有提過。
ES 本身的設計就是 REST API 的風格,所以可想而知刪除一個 index 就是 DELETE /users
這麼簡單而已。
終於,我們要寫入資料到 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
呢?換個角度想,在 REST API 的風格中,針對某一個特定的資源進行更新,我們會使用 PUT
,所以可以寫成這樣:
PUT /users/_doc/1
,結果如下:
其實 ES 有預設的機制,當我們在建立叢集時可以設定一個叫做 auto_create_index
的值,預設是 true,效果就是直接寫入 document 會幫你自動建立 index,這點和關聯式資料庫很不一樣,我們需要先建立資料表,才能寫入資料。
所以我們可以直接 POST /character/_doc
搭配 payload:
{
"name": "ruffy"
}
就會自動建立 shards 以及寫入 document:
聰明如你,要怎麼讀取 document 的方式,應該是不需要示範,只要使用 GET /users/_doc/1 就可以讀取到我剛剛寫入的資料了。
如何更新 document 呢?使用 POST
搭配 /index_name/_update/:id
的 endpoint 去更新某一個 document,我們試著把剛剛 _id=1
的 document 更新年紀。
甚至要新增欄位,也是使用相同的 API:
至於為什麼要使用 POST
呢?POST
不都是用在於建立新的資源嗎?
其實這麼想是正確的喔!因為 ES 內的 documents 都是不可變的,所以可以想像成我們確實是在建立新的資源沒錯。
不可變?但剛剛我們才更新了兩次 document,怎麼會是不可變呢?
ES 是採用取代的方式,而不是使用更新舊有資料的方式來達到更新,至於 ES 如何做到的?這之後會特別提到,但主要的關鍵字就是 immutable segment
以及標記 deleted
和 version
這幾個關鍵字。