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

本文主要是介紹 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 自動生成文檔 idpost

本身指定文檔 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,且 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

相關文章
相關標籤/搜索