iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 5
0

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

尚未有邦友留言

立即登入留言