本文翻譯自:www.elastic.co/guide/en/el…html
本文是Elasticsearch的入門文檔,將會介紹ElasticSearch中關於修改,更新和刪除數據的相關操做。bash
Elasticsearch近乎實時提供數據操做和搜索功能。默認狀況下,你能夠在你索引/更新/刪除操做數據的一秒鐘延遲(刷新間隔)後,看到其出如今搜索結果中。這是與其餘平臺(如SQL)的重要區別,這類型的平臺數據在事務完成後能夠當即使用。網絡
咱們之前看過咱們如何索引一個文檔。以下:elasticsearch
PUT /customer/external/1?pretty
{
"name": "John Doe"
}複製代碼
接下來,將上述將指定的文檔索引到外部類型,ID爲1的自定義索引。若是咱們再次使用不一樣的(或相同)文檔執行上述命令,Elasticsearch將替換(即從新索引),新的文檔現有的ID爲1,且出如今頂部:ide
PUT /customer/external/1?pretty
{
"name": "Jane Doe"
}複製代碼
以上將ID爲1的文檔的名稱從「John Doe」更改成「Jane Doe」。另外一方面,若是咱們使用不一樣的ID,則新的文檔將被編入索引,而且已經在索引中的現有文檔保持不變(至關於複製),以下:ui
PUT /customer/external/2?pretty
{
"name": "Jane Doe"
}複製代碼
以上索引爲一個ID爲2的新文檔。索引時,ID部分是可選的。若是沒有指定,Elasticsearch將生成一個隨機ID,而後使用它來對文檔進行索引。索引API調用的返回值中包含Elasticsearch生成的實際ID(或者咱們在前面的例子中明確指定的任何內容)。spa
此示例顯示如何索引沒有顯式ID的文檔:翻譯
POST /customer/external?pretty
{
"name": "Jane Doe"
}複製代碼
請注意,在上述狀況下,咱們使用POST動詞而不是PUT,由於咱們沒有指定ID。code
除了可以索引和替換文檔外,咱們還能夠更新文檔。注意,雖然Elasticsearch實際上並無在底層進行及時更新。每當咱們進行更新時,Elasticsearch都會刪除舊的文檔,而後對一個新文檔進行索引(至關於複製),同時更新一次應用更新。htm
此示例顯示如何經過將名稱字段更改成「Jane Doe」,以此來更新咱們之前的文檔(ID爲1):
POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe" }
}複製代碼
此示例顯示如何經過將名稱字段更改成「Jane Doe」來更新咱們之前的文檔(ID爲1),同時在其中添加一個年齡字段:
POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe", "age": 20 }
}複製代碼
也可使用簡單的腳原本執行更新。此示例使用腳本將年齡增長5:
POST /customer/external/1/_update?pretty
{
"script" : "ctx._source.age += 5"
}複製代碼
在上面的例子中,ctx._source是指當前的源文檔即將被更新。
請注意,在撰寫本文時,一次只能對單個文檔執行更新。在未來,Elasticsearch可能會提供給予查詢條件的多個文檔的更新功能(如SQL UPDATE-WHERE語句)。
刪除文檔是至關簡單的。此示例顯示如何刪除咱們以前的ID爲2的客戶:
DELETE /customer/external/2?pretty複製代碼
請參閱_delete_by_query API以刪除與特定查詢相匹配的全部文檔。值得注意的是,刪除整個索引效率更高,而不是使用「按查詢刪除」API刪除符合的文檔。
除了可以索引,更新和刪除單個文檔以外,Elasticsearch還提供了使用_bulk API批量執行上述任何操做的功能。這個功能很重要,由於它提供了一個很是有效的機制來儘量快地進行多個操做,儘量少的網絡往返行程。
做爲一個快速示例,如下調用在一個批量操做中指定兩個文檔(ID 1 - John Doe和ID 2 - Jane Doe):
POST /customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }複製代碼
此示例更新第一個文檔(ID爲1),而後在一個批量操做中刪除第二個文檔(ID爲2):
POST /customer/external/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}複製代碼
請注意,對於刪除操做,在它以後沒有相應的源文檔,由於刪除只須要待刪除的文檔的ID。
因爲其中一個操做失敗,Bulk API不會失敗。若是一個單一的動做因爲任何緣由而失敗,它將繼續處理其後的其他動做。當批量API返回時,它將爲每一個操做提供一個狀態(按照發送的相同順序),以便·能夠檢查特定操做是否失敗。