ElasticSearch 文檔的增刪改查都不會?


本文主要是介紹 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,且 foundfalse,具體結果如下:

更新文檔

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 調用中,對不同的索引進行操作,從而減少網絡傳輸開銷,提升寫入速率。

它支持 IndexCreateUpdateDelete 四種類型操作,可以在 URI 中指定索引,也可以在請求的方法體中進行。

同時多條操作中如果其中有一條失敗,也不會影響其他的操作,並且返回的結果包括每一條操作執行的結果。

比如輸入如下代碼:

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

took 表示消耗了 93 毫秒,errorstrue 表示在這些操作中錯誤發生,發現是 update 操作發生了錯誤,id 為 2 的文檔不存在,所以報錯了。

在使用 Bulk API 的時候,當 errorstrue 時,需要把錯誤的操作修改掉,防止存到 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM