本文主要是介紹 ElasticSearch 的文檔增刪改查和批量操做,同時會介紹一些 REST API 返回狀態碼的具體含義。html
咱們先來看下這個表:網絡
這個表包含了 Index、Create、Read、Update、Delete 這五種方法,咱們先來看下 CRUD 操做的 HTTP 請求都長什麼樣子?elasticsearch
首先是提供一個 HTTP 的 method,後面是索引名字,在 7.0 以後因此的 Type 都用 _doc
表示,後面是文檔 id。ide
再簡單瞭解了 CURD 操做的 HTTP 請求後,那麼讓咱們先來了解下如何建立文檔:函數
Create 支持兩種方式,一種是指定文檔 id 建立文檔,像上面這張圖就是;另外一種是經過調用 post /users/_doc
去讓 ES 自動生成文檔 id。post
本身指定文檔 id建立文檔,須要考慮 id 的均衡性,避免產生分配不均衡的問題。 ES 的 hash 函數會確保文檔 id 被均勻分配到不一樣的分片。性能
當咱們執行剛纔的命令,能夠返回以下結果:ui
其中 _version
每一次操做,都會 + 1,它是一個鎖的機制,當並行修改文檔的時候,更新的版本號比文檔當前的版本號小時就會報錯,不容許作修改。3d
建立文檔時,若是索引不存在,ES 會自動建立對應的 index 和 type。code
接下來看下另外一種建立文檔的方式,不指定 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 操做後,讓咱們來看看批量操做吧:
在一個 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 常見錯誤返回有哪些吧!
剛纔在演示中,當查詢文檔 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