
本文主要是介紹 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