Elasticsearch幾乎實時提供數據操做和搜索功能,默認狀況下,從索引/更新/刪除數據到搜索結果中顯示的時間,你能夠得到一秒鐘的延遲(刷新間隔),這是與SQL等其餘平臺的重要區別,其中數據在事務完成後當即可用。html
咱們以前已經看到了如何索引單個文檔,讓咱們再次回想一下這個命令:segmentfault
PUT /customer/_doc/1?pretty { "name": "John Doe" }
一樣,上面將指定的文檔索引到customer索引中,ID爲1。若是咱們再使用不一樣(或相同)的文檔再次執行上述命令,Elasticsearch將在ID爲1的現有文檔之上替換(即從新索引)新文檔:網絡
PUT /customer/_doc/1?pretty { "name": "Jane Doe" }
以上內容將ID爲1的文檔名稱從「John Doe」更改成「Jane Doe」,另外一方面,若是咱們使用不一樣的ID,則會對新文檔索引,而且索引中已有的現有文檔保持不變。elasticsearch
PUT /customer/_doc/2?pretty { "name": "Jane Doe" }
以上索引ID爲2的新文檔。ide
索引時,ID部分是可選的,若是未指定,Elasticsearch將生成隨機ID,而後使用它來索引文檔,Elasticsearch生成的實際ID(或前面示例中顯式指定的內容)將做爲索引API調用的一部分返回。ui
此示例顯示如何在沒有顯式ID的狀況下索引文檔:code
POST /customer/_doc?pretty { "name": "Jane Doe" }
請注意,在上述狀況下,咱們使用POST
動詞而不是PUT,由於咱們沒有指定ID。htm
除了可以索引和替換文檔,咱們還能夠更新文檔,請注意,Elasticsearch實際上並無在內部進行就地更新,每當咱們進行更新時,Elasticsearch都會刪除舊文檔,而後一次性對應用了更新的新文檔索引。索引
此示例顯示如何經過將名稱字段更改成「Jane Doe」來更新之前的文檔(ID爲1):事務
POST /customer/_doc/1/_update?pretty { "doc": { "name": "Jane Doe" } }
此示例顯示如何經過將名稱字段更改成「Jane Doe」來更新咱們之前的文檔(ID爲1),同時向其添加年齡字段:
POST /customer/_doc/1/_update?pretty { "doc": { "name": "Jane Doe", "age": 20 } }
也可使用簡單腳本執行更新,此示例使用腳本將年齡增長5:
POST /customer/_doc/1/_update?pretty { "script" : "ctx._source.age += 5" }
在上面的示例中,ctx._source
指的是即將更新的當前源文檔。
Elasticsearch提供了在給定查詢條件的狀況下更新多個文檔的能力(如SQL UPDATE-WHERE語句,請參閱docs-update-by-query API。
刪除文檔很是簡單,此示例顯示如何刪除之前的ID爲2的customer:
DELETE /customer/_doc/2?pretty
請參閱_delete_by_query API以刪除與特定查詢匹配的全部文檔,值得注意的是,刪除整個索引而不是使用Delete By Query API刪除全部文檔會更有效。
除了可以索引,更新和刪除單個文檔以外,Elasticsearch還提供了使用_bulk API批量執行上述任何操做的功能。此功能很是重要,由於它提供了一種很是有效的機制,能夠儘量快地執行多個操做,並儘量少地進行網絡往返。
做爲一個簡單示例,如下調用在一個批量操做中索引兩個文檔(ID 1 - John Doe和ID 2 - Jane Doe):
POST /customer/_doc/_bulk?pretty {"index":{"_id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" }
此示例更新第一個文檔(ID爲1),而後在一個批量操做中刪除第二個文檔(ID爲2):
POST /customer/_doc/_bulk?pretty {"update":{"_id":"1"}} {"doc": { "name": "John Doe becomes Jane Doe" } } {"delete":{"_id":"2"}}
請注意,對於刪除操做,以後沒有相應的源文檔,由於刪除只須要刪除文檔的ID。
Bulk API不會因其中一個操做失敗而失敗,若是單個操做因任何緣由失敗,它將繼續處理其後的其他操做,批量API返回時,它將爲每一個操做提供一個狀態(按照發送的順序),以便你能夠檢查特定操做是否失敗。