iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
1
Elastic Stack on Cloud

Elastic Stack武學練功坊系列 第 5

Elastic Stack第五重

Elasticsearch CRUD

主要說明 es CRUD的實作方式以及範例
此篇先介紹使用 cURL 實作 CURD,下一重再介紹kibana實作


如何操作Elasticsearch

es提供REST API,可用來管理cluster、建index、新增資料、搜尋資料等等
可透過 command line(cURL)kibana的console(Dev Tools) 來操作
對於應用程式(APP),也可使用官方提供的客戶端(es client)來達成
而這些操作的指令都是es定義且為JSON格式的查詢語言(Query DSL)


Elasticsearch CRUD (cURL)

cURL 介紹

使用 cURL 的方式發request給es 和 任何HTTP request的格式一樣

curl -u <USER:PASSWORD> -X<VERB> -H <HEADER> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

<USER>
帳號(optional)
如果server是需要驗證,則需要提供

<PASSWORD>
密碼(optional)
如果server是需要驗證,則需要提供

<VERB>
HTTP Method (GET, POST, PUT, HEAD, DELETE, and etc.)
如未提供,則預設是 GET

<HEADER>
request header資訊

<PROTOCOL>
httphttps

<HOST>
node的主機名稱或ip,如果是架在本機可使用localhost

<PORT>
es使用的port
如自己架設在機器內,es預設使用的port是9200

<PATH>
即API

<QUERY_STRING>
query的參數 (optional),
例如:使用 ?pretty(pretty-print)可讓回傳的JSON更易讀

<BODY>
JSON編碼的body (不一定每個query都需要body)

此處僅介紹基本且es cURL比較常用到的參數,詳細更多資訊可參考Reference的 cURL Intro

使用 cURL 實作 CURD

前置作業

  • 取得 <PROTOCOL>://<HOST>:<PORT>

需要完成Elastic Cloud的部署,如未完成請先至 Elastic Stack第三重 完成部署
如已完成部署,至部署詳目頁,點擊 應用程式(Applications)Elasticsearch 旁的 Copy endpoint
以我的為例,endpoint為 https://{hash value}.asia-east1.gcp.elastic-cloud.com:9243
以下範例會使用 {endpoint} 來代替

  • 取得 <USER:PASSWORD>
    即帳密,之前部署完成時,出現的彈跳視窗的帳密
    以下範例會使用 {AUTH} 來代替

如果真的忘記或沒記下來的話,還是有救的,官方提供的 重設密碼

取得指定index內的所有documents
Request

curl -u {AUTH} {endpoint}/shawn_index/_search?pretty

介紹一下cURL參數的對應,以此為例,後續就以此類推不多加闡述

  • <VERB> -> 此處沒有指定,則會使用預設的GET
  • <PATH> -> shawn_index/_search
  • <QUERY_STRING> -> pretty

Response
Search Response
結果:
回傳錯誤(error),查看錯誤原因(error.root_cause.reason)是no such index [shawn_index]
這是正確的,因為我根本還沒建立index也還沒新增資料!!!

會先教學操作 取得index內的documents,是為了讓後續操作可以以此指令來做驗證

新增資料(index)-不指定id

[補充說明]
此處的index為動詞(可想像為新增的意思)
如上述的index內的documents的index即為名詞
官方文件都是這樣用,我就不更動,以後如果大家在看官方文件也比較快理解

Request

curl -u {AUTH} {endpoint}/shawn_index/_doc?pretty -XPOST -H "Content-Type: application/json" -d "{\"name\": \"Benedict Cumberbatch\", \"television\": [\"Sherlock\", \"To the Ends of the Earth\"]}"

-d後面為 <BODY> ,使用者可自行輸入

[注意]
裡面需要多加反斜線(backslash),否則會無法被解析 (我環境是 Windows 10 + cmder)

Response
Index Response
結果:
成功新增資料,以此為例,此時我已新增了index shawn_index,且建立了一筆資料

即使在沒有建立index以及指定fields情況下,仍可成功新增,是es的特性,詳細介紹可參閱 Elastic Stack第二重

驗證結果:
使用 取得指定index內的所有documents 來查看剛剛那筆資料是否存在

教個偷懶的做法,因為是 GET method,所以可以直接把 {endpoint}/shawn_index/_search?pretty 貼到瀏覽器來查看,就不需要一直用 cURL 了

Verification

更新資料(update)
Request

curl -u {AUTH} {endpoint}/shawn_index/_doc/PdmeqnQBEQfIjDy12AEW?pretty -XPOST -H "Content-Type: application/json" -d "{\"name\": \"Benedict Cumberbatch\", \"television\": [\"Sherlock\", \"To the Ends of the Earth\", \"Hawking\"]}"

此處的{_id},請填入 新增資料(index)-不指定id 的response中的 _id -> PdmeqnQBEQfIjDy12AEW

Response
Update Response
成功更新資料,其中可以發現 _version(版本計數) 更新到 2

驗證結果:
Verification

取得單筆資料(document)
Request

curl -u {AUTH} {endpoint}/shawn_index/_doc/PdmeqnQBEQfIjDy12AEW?pretty

此處的{_id},請填入上述 新增資料(index)-不指定id/更新資料(update) 的response中的 _id -> PdmeqnQBEQfIjDy12AEW

Response
Retrieve Doc Response

新增資料(index)-指定id
Request

curl -u {AUTH} {endpoint}/shawn_index/_doc/{_id}?pretty -XPUT -H "Content-Type: application/json" -d "{\"name\": \"Martin Freeman\", \"television\": [\"Sherlock\", \"A Confession\"]}"

此處的{_id}請自行輸入欲設定的id -> my_id

官方文件: 欲指定_id是用PUT method,但實測過POST也是可以的

Response
Index With Id Response
成功新增資料,其中可以發現 _id 是request內指定的 my_id

驗證結果:
Verification

刪除單筆資料(document)
Request

curl -u {AUTH} {endpoint}/shawn_index/_doc/{_id}?pretty -XDELETE

此處的{_id}請自行輸入欲刪除的id -> my_id

Response
Delete Doc Response

驗證結果:
Verification


小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正


Reference

Query DSL
cURL Intro
Official Es cURL examples


上一篇
Elastic Stack第四重
下一篇
Elastic Stack第六重
系列文
Elastic Stack武學練功坊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言