[翻譯]ElasticSearch官方文件-資料的修改

飛來來發表於2017-10-21

本文翻譯自:www.elastic.co/guide/en/el…

本文是Elasticsearch的入門文件,將會介紹ElasticSearch中關於修改,更新和刪除資料的相關操作。

修改資料

Elasticsearch近乎實時提供資料操作和搜尋功能。預設情況下,你可以在你索引/更新/刪除運算元據的一秒鐘延遲(重新整理間隔)後,看到其出現在搜尋結果中。這是與其他平臺(如SQL)的重要區別,這型別的平臺資料在事務完成後可以立即使用。

索引和替換文件

我們以前看過我們如何索引一個文件。如下:

PUT /customer/external/1?pretty
{
  "name": "John Doe"
}複製程式碼

接下來,將上述將指定的文件索引到外部型別,ID為1的自定義索引。如果我們再次使用不同的(或相同)文件執行上述命令,Elasticsearch將替換(即重新索引),新的文件現有的ID為1,且出現在頂部:

PUT /customer/external/1?pretty
{
  "name": "Jane Doe"
}複製程式碼

以上將ID為1的文件的名稱從“John Doe”更改為“Jane Doe”。另一方面,如果我們使用不同的ID,則新的文件將被編入索引,並且已經在索引中的現有文件保持不變(相當於複製),如下:

PUT /customer/external/2?pretty
{
  "name": "Jane Doe"
}複製程式碼

以上索引為一個ID為2的新文件。索引時,ID部分是可選的。如果沒有指定,Elasticsearch將生成一個隨機ID,然後使用它來對文件進行索引。索引API呼叫的返回值中包含Elasticsearch生成的實際ID(或者我們在前面的例子中明確指定的任何內容)。

此示例顯示如何索引沒有顯式ID的文件:

POST /customer/external?pretty
{
  "name": "Jane Doe"
}複製程式碼

請注意,在上述情況下,我們使用POST動詞而不是PUT,因為我們沒有指定ID。

更新文件

除了能夠索引和替換文件外,我們還可以更新文件。注意,雖然Elasticsearch實際上並沒有在底層進行及時更新。每當我們進行更新時,Elasticsearch都會刪除舊的文件,然後對一個新文件進行索引(相當於複製),同時更新一次應用更新。

此示例顯示如何通過將名稱欄位更改為“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返回時,它將為每個操作提供一個狀態(按照傳送的相同順序),以便·可以檢查特定操作是否失敗。

相關文章