本文主要是介紹 ElasticSearch 的文檔增刪改查和批量操作霸奕,同時(shí)會(huì)介紹一些 REST API 返回狀態(tài)碼的具體含義。
我們先來看下這個(gè)表:
這個(gè)表包含了 Index吉拳、Create质帅、Read、Update留攒、Delete 這五種方法煤惩,我們先來看下 CRUD 操作的 HTTP 請(qǐng)求都長(zhǎng)什么樣子?
首先是提供一個(gè) HTTP 的 method炼邀,后面是索引名字魄揉,在 7.0 之后所以的 Type 都用 _doc
表示,后面是文檔 id拭宁。
再簡(jiǎn)單了解了 CURD 操作的 HTTP 請(qǐng)求后洛退,那么讓我們先來了解下如何創(chuàng)建文檔:
創(chuàng)建文檔
Create 支持兩種方式瓣俯,一種是指定文檔 id 創(chuàng)建文檔,像上面這張圖就是兵怯;另一種是通過調(diào)用 post /users/_doc
去讓 ES 自動(dòng)生成文檔 id彩匕。
自己指定文檔 id創(chuàng)建文檔,需要考慮 id 的均衡性摇零,避免產(chǎn)生分配不均衡的問題推掸。
ES 的 hash 函數(shù)會(huì)確保文檔 id 被均勻分配到不同的分片。
當(dāng)我們執(zhí)行剛才的命令驻仅,可以返回如下結(jié)果:
其中 _version
每一次操作谅畅,都會(huì) + 1,它是一個(gè)鎖的機(jī)制噪服,當(dāng)并行修改文檔的時(shí)候毡泻,更新的版本號(hào)比文檔當(dāng)前的版本號(hào)小時(shí)就會(huì)報(bào)錯(cuò),不允許做修改粘优。
創(chuàng)建文檔時(shí)仇味,如果索引不存在,ES 會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的 index 和 type雹顺。
接下來看下另一種創(chuàng)建文檔的方式丹墨,不指定 id 創(chuàng)建文檔,HTTP 請(qǐng)求也變?yōu)榱?POST嬉愧,具體的請(qǐng)求如下:
返回的結(jié)果如下:
Index 和 Create 區(qū)別為:如果文檔不存在贩挣,就索引新的文檔,否則現(xiàn)有文檔就會(huì)被刪除没酣,新的文檔被索引王财,版本信息 _version
+ 1。
查詢文檔
Get 方法比較簡(jiǎn)單裕便,只需要 Get 索引名稱/_doc/文檔 id
绒净,通過執(zhí)行這個(gè)命令就可以知道文檔的具體信息了。
當(dāng)執(zhí)行這條語句后會(huì)返回 HTTP 200偿衰,具體返回結(jié)果如下:
其中 _index
為索引挂疆,_type
為類型,_id
為文檔 id下翎,_version
為版本信息缤言,_source
存儲(chǔ)了文檔的完整原始數(shù)據(jù)。
當(dāng)查詢的文檔 id 不存在的時(shí)候漏设,會(huì)返回 HTTP 404墨闲,且 found
為 false
,具體結(jié)果如下:
更新文檔
Update 方法采用 HTTP POST郑口,在請(qǐng)求體中必須指明 doc鸳碧,在把具體文檔提供在 HTTP 的 body 里盾鳞。Update 和 Index 方法不同,Update 方法不會(huì)刪除原來的文檔瞻离,而是實(shí)現(xiàn)真正的數(shù)據(jù)更新腾仅。
比如在原來的文檔 id 為 1 的文檔上增加字段,具體請(qǐng)求如下:
執(zhí)行后套利,版本信息 _version
+ 1推励,讓我們?cè)偃ゲ樵兿略撐臋n:
可以看到,新增字段已經(jīng)成功了肉迫。
刪除文檔
Delete 方法也很簡(jiǎn)單验辞,Delete 索引名稱/_doc/文檔 id
就可以了,再這里就不再做代碼演示了喊衫。
在介紹完文檔的基本 CRUD 操作后跌造,讓我們來看看批量操作吧:
Bulk API
在一個(gè) REST 請(qǐng)求中,重新建立網(wǎng)絡(luò)開銷是十分損耗性能的族购,因此 ES 提供 Bulk API壳贪,支持在一次 API 調(diào)用中,對(duì)不同的索引進(jìn)行操作寝杖,從而減少網(wǎng)絡(luò)傳輸開銷违施,提升寫入速率。
它支持 Index
瑟幕、Create
磕蒲、Update
、Delete
四種類型操作收苏,可以在 URI 中指定索引亿卤,也可以在請(qǐng)求的方法體中進(jìn)行愤兵。
同時(shí)多條操作中如果其中有一條失敗鹿霸,也不會(huì)影響其他的操作,并且返回的結(jié)果包括每一條操作執(zhí)行的結(jié)果秆乳。
比如輸入如下代碼:
當(dāng)我們執(zhí)行命令后懦鼠,結(jié)果如下:
took
表示消耗了 93 毫秒,errors
為 true
表示在這些操作中錯(cuò)誤發(fā)生屹堰,發(fā)現(xiàn)是 update 操作發(fā)生了錯(cuò)誤肛冶,id 為 2 的文檔不存在,所以報(bào)錯(cuò)了扯键。
在使用 Bulk API 的時(shí)候睦袖,當(dāng) errors
為 true
時(shí),需要把錯(cuò)誤的操作修改掉荣刑,防止存到 ES 的數(shù)據(jù)有缺失馅笙。
批量查詢文檔
批量查詢需要指明要查詢文檔的 id伦乔,可以在一個(gè) _mget
操作里查詢不同索引的數(shù)據(jù),可以減少網(wǎng)絡(luò)連接所產(chǎn)生的開銷董习,提高性能烈和。
下面我們來實(shí)際操作下,輸入以下代碼執(zhí)行皿淋,就可以得到文檔 id 為 1,3 的數(shù)據(jù)招刹。
運(yùn)行結(jié)果如下:
在介紹完文檔的一些操作,最后讓我們看下 REST API 常見錯(cuò)誤返回有哪些吧窝趣!
REST API 常見錯(cuò)誤返回
剛才在演示中疯暑,當(dāng)查詢文檔 id 不存在的時(shí)候就會(huì)報(bào) 404 錯(cuò)誤,而且 ES 還有各種各樣的返回哑舒,下面通過一個(gè)表格了解下:
總結(jié)
本文主要介紹了文檔的 CRUD 操作缰儿,還有 Bulk API、_mget API散址,這些批量操作可以提高 API 調(diào)用性能乖阵,但是不要一次發(fā)送過多數(shù)據(jù),也有可能會(huì)對(duì) ES 集群產(chǎn)生過大的壓力预麸,導(dǎo)致性能有所下降瞪浸。一般建議是 1000-5000 個(gè)文檔,如果你的文檔很大吏祸,可以適當(dāng)減少隊(duì)列对蒲,大小建議是 5-15 MB,默認(rèn)不能超過 100 M贡翘。
參考文獻(xiàn)
Elastic Stack從入門到實(shí)踐
Elasticsearch頂尖高手系列
Elasticsearch核心技術(shù)與實(shí)戰(zhàn)
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs-index_.html