- 文章名稱:Elasticsearch Reference[2.2]
- 原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/2.2/_modifying_your_data.html
- github地址:https://github.com/rpgmakervx/elasticsearch-reference-translation
- 原文鏈接:https://www.code4j.tech
- 譯者:code4j
修改數(shù)據(jù)
Elasticsearch提供近實(shí)時的數(shù)據(jù)操作和搜索功能。默認(rèn)情況下,數(shù)據(jù)從寫入/更新到被檢索到需要1s(刷新間隔配置的時間)左右鸳劳。這是和其他存儲引擎一個很重要的不同呆馁,像數(shù)據(jù)庫中的數(shù)據(jù)窄做,事務(wù)執(zhí)行完后數(shù)據(jù)就立馬可見队询。
索引/替換文檔
我們之前已經(jīng)知道如何創(chuàng)建一個文檔了佃迄,在執(zhí)行一次:
curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'
上面將指定文檔索引到customer索引的externaltype中泼差,id為1贵少。如果我們再次執(zhí)行上面的命令,用不同或相同的文檔堆缘,Elasticsearch將會用新的文檔覆蓋上面的現(xiàn)有的id為1的那個文檔(或稱作reindex
)滔灶。
curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "Jane Doe"
}'
上面的命令將id為1的文檔名從"John Doe"改為了"Jane Doe"。另一方面套啤,如果我們使用不同的id宽气,將會創(chuàng)建一個新的文檔到索引中,原有的文檔將不會被改變潜沦。
curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '
{
"name": "Jane Doe"
}'
上面的命令索引了一個ID為2的新文檔萄涯。
索引的時候,ID參數(shù)是可選的唆鸡,如果沒有指定涝影,Elasticsearch將會生成一個隨機(jī)的ID并用他作為文檔ID,ES生成的ID(或者我們指定了的ID)將會作為調(diào)用API的返回結(jié)果返回争占。
下面的例子告訴我們?nèi)绾尾恢付↖D創(chuàng)建文檔燃逻。
curl -XPOST 'localhost:9200/customer/external?pretty' -d '
{
"name": "Jane Doe"
}'
注意,上面的例子因?yàn)闆]有指定ID臂痕,所以我們用的是POST請求伯襟,而不是PUT
(譯者批注:實(shí)際使用中譯者使用POST和PUT都可以實(shí)現(xiàn)插入更新,并沒有發(fā)現(xiàn)什么不同握童,實(shí)際上源碼里也能看到姆怪,創(chuàng)建文檔的handler里面能同時處理POST和PUT兩類請求)
更新文檔
除了新建或覆蓋文檔,我們還能修改文檔澡绩。但是要注意Elasticsearch底層并不是直接在原來的數(shù)據(jù)上做更新稽揭。每當(dāng)我們執(zhí)行更新操作,ES刪除老文檔然后創(chuàng)建新文檔肥卡,這兩步是在一次更新請求中完成的溪掀。
下面的例子展示如何修改之前那個ID為1的文檔,修改名字為”Jane Doe“步鉴。
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"doc": { "name": "Jane Doe" }
}'
下面的例子展示如何修改文檔的名字為”Jane Doe“并增加一個age字段:
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"doc": { "name": "Jane Doe", "age": 20 }
}'
更新操作也可以使用簡單的腳本揪胃。注意,像下面這種動態(tài)腳本在1.4.3版本默認(rèn)是禁止的氛琢,細(xì)節(jié)請看scripting docs只嚣。這個腳本的作用是給年齡加5:
curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"script" : "ctx._source.age += 5"
}'
(譯者批注:腳本功能十分強(qiáng)大,但是并不推薦使用艺沼,特別是查詢册舞。類似關(guān)系型數(shù)據(jù)庫的存儲過程,雖然能處理復(fù)雜業(yè)務(wù)邏輯但是把過于復(fù)雜的邏輯置于ES引擎對性能是一種損耗障般,ES默認(rèn)禁用這個特性也是有道理的调鲸。)
上面的例子中盛杰,ctx._source
引用的是你要更新的文檔(也就是ID為1的文檔)。
注意一次只能修改一個文檔藐石,未來版本可能會提供批量按條件修改的API即供,類似SQL中的 update where條件。
刪除文檔
刪除文檔相當(dāng)簡單于微,下面的例子表示刪除ID為2的文檔:
DELETE /customer/doc/2?pretty
刪除同樣也提供了批量刪除API(插件)逗嫡,不過值得一提的是,如果需要清空數(shù)據(jù)株依,刪除整個索引比批量刪除所有文檔效率更高驱证。
(譯者批注:關(guān)于批量修改,還有批量刪除恋腕,都有對應(yīng)的插件抹锄,但實(shí)際上也是使用滾動查詢?nèi)缓笠粭l條刪除,執(zhí)行速度十分慢荠藤,若該過程執(zhí)行較長伙单,服務(wù)層等待隊(duì)列可能會出現(xiàn)請求超時,因此該特性建議在測試環(huán)境哈肖,或命令行模式流量低峰期使用吻育,線上接口不推薦提供。推薦使用批量更新或刪除接口淤井,或多起幾個線程單條刪除布疼。)
批量操作
除了增刪改單個文檔之外,以上操作ES還提供了批量執(zhí)行: _bulk
API庄吼,批量機(jī)制十分高效,能利用盡可能少的網(wǎng)絡(luò)開銷來盡可能提升數(shù)據(jù)處理速度严就。
示例如下总寻,下面使用一個批量接口索引兩個文檔:
POST /customer/doc/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
更新第一個文檔并刪除第二個文檔:
POST /customer/doc/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
注意第二個刪除操作,操作中并不包含源文檔信息梢为,因?yàn)閯h除只需要提供ID即可渐行。
批量操作其中一個操作失敗了,并不會影響整個操作铸董,如果一個操作失敗了其他操作還是會繼續(xù)執(zhí)行祟印。當(dāng)批量執(zhí)行結(jié)束,會得到一個返回響應(yīng)粟害,里面包括每個操作的狀態(tài)碼信息蕴忆,你可以通過這個信息觀察某個操作是否失敗。
上一節(jié):Elasticsearch官檔翻譯——1.3 探索集群
下一節(jié):Elasticsearch官檔翻譯——1.5 探索數(shù)據(jù)