本文主要是介紹 ElasticSearch 的檔案增刪改查和批量操作,同時會介紹一些 REST API 回傳狀態碼的具體含義,
我們先來看下這個表:

這個表包含了 Index、Create、Read、Update、Delete 這五種方法,我們先來看下 CRUD 操作的 HTTP 請求都長什么樣子?
首先是提供一個 HTTP 的 method,后面是索引名字,在 7.0 之后所以的 Type 都用 _doc 表示,后面是檔案 id,
再簡單了解了 CURD 操作的 HTTP 請求后,那么讓我們先來了解下如何創建檔案:
創建檔案

Create 支持兩種方式,一種是指定檔案 id 創建檔案,像上面這張圖就是;另一種是通過呼叫 post /users/_doc 去讓 ES 自動生成檔案 id,
自己指定檔案 id創建檔案,需要考慮 id 的均衡性,避免產生分配不均衡的問題,
ES 的 hash 函式會確保檔案 id 被均勻分配到不同的分片,
當我們執行剛才的命令,可以回傳如下結果:

其中 _version 每一次操作,都會 + 1,它是一個鎖的機制,當并行修改檔案的時候,更新的版本號比檔案當前的版本號小時就會報錯,不允許做修改,
創建檔案時,如果索引不存在,ES 會自動創建對應的 index 和 type,
接下來看下另一種創建檔案的方式,不指定 id 創建檔案,HTTP 請求也變為了 POST,具體的請求如下:

回傳的結果如下:

Index 和 Create 區別為:如果檔案不存在,就索引新的檔案,否則現有檔案就會被洗掉,新的檔案被索引,版本資訊 _version + 1,
查詢檔案
Get 方法比較簡單,只需要 Get 索引名稱/_doc/檔案 id,通過執行這個命令就可以知道檔案的具體資訊了,

當執行這條陳述句后會回傳 HTTP 200,具體回傳結果如下:

其中 _index 為索引,_type 為型別,_id 為檔案 id,_version 為版本資訊,_source 存盤了檔案的完整原始資料,
當查詢的檔案 id 不存在的時候,會回傳 HTTP 404,且 found 為 false,具體結果如下:

更新檔案
Update 方法采用 HTTP POST,在請求體中必須指明 doc,在把具體檔案提供在 HTTP 的 body 里,Update 和 Index 方法不同,Update 方法不會洗掉原來的檔案,而是實作真正的資料更新,
比如在原來的檔案 id 為 1 的檔案上增加欄位,具體請求如下:

執行后,版本資訊 _version + 1,讓我們再去查詢下該檔案:

可以看到,新增欄位已經成功了,
洗掉檔案
Delete 方法也很簡單,Delete 索引名稱/_doc/檔案 id 就可以了,再這里就不再做代碼演示了,
在介紹完檔案的基本 CRUD 操作后,讓我們來看看批量操作吧:
Bulk API
在一個 REST 請求中,重新建立網路開銷是十分損耗性能的,因此 ES 提供 Bulk API,支持在一次 API 呼叫中,對不同的索引進行操作,從而減少網路傳輸開銷,提升寫入速率,
它支持 Index、Create、Update、Delete 四種型別操作,可以在 URI 中指定索引,也可以在請求的方法體中進行,
同時多條操作中如果其中有一條失敗,也不會影響其他的操作,并且回傳的結果包括每一條操作執行的結果,
比如輸入如下代碼:

當我們執行命令后,結果如下:

took 表示消耗了 93 毫秒,errors 為 true 表示在這些操作中錯誤發生,發現是 update 操作發生了錯誤,id 為 2 的檔案不存在,所以報錯了,
在使用 Bulk API 的時候,當 errors 為 true 時,需要把錯誤的操作修改掉,防止存到 ES 的資料有缺失,
批量查詢檔案
批量查詢需要指明要查詢檔案的 id,可以在一個 _mget 操作里查詢不同索引的資料,可以減少網路連接所產生的開銷,提高性能,
下面我們來實際操作下,輸入以下代碼執行,就可以得到檔案 id 為 1,3 的資料,

運行結果如下:

在介紹完檔案的一些操作,最后讓我們看下 REST API 常見錯誤回傳有哪些吧!
REST API 常見錯誤回傳
剛才在演示中,當查詢檔案 id 不存在的時候就會報 404 錯誤,而且 ES 還有各種各樣的回傳,下面通過一個表格了解下:

總結
本文主要介紹了檔案的 CRUD 操作,還有 Bulk API、_mget API,這些批量操作可以提高 API 呼叫性能,但是不要一次發送過多資料,也有可能會對 ES 集群產生過大的壓力,導致性能有所下降,一般建議是 1000-5000 個檔案,如果你的檔案很大,可以適當減少佇列,大小建議是 5-15 MB,默認不能超過 100 M,
參考文獻
Elastic Stack從入門到實踐
Elasticsearch頂尖高手系列
Elasticsearch核心技術與實戰
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs-index_.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/22745.html
標籤:大數據
上一篇:小弟雪中跪求一條sql陳述句,根據父節點遞回查詢所有子節點。
下一篇:問題
