前面的基礎,html
首先,明確一個概念,es包括所有更新和局部更新!curl
ES所有更新elasticsearch
ES能夠使用PUT或者POST對文檔進行更新(所有更新),若是指定ID的文檔已經存在,則執行更新操做。oop
好比,我這裏,id=1文檔存在,那麼,就是es所有更新。post
注意:url
es執行更新操做的時候,ES首先將舊的文檔標記爲刪除狀態,而後添加新的文檔,舊的文檔不會當即消失,可是你也沒法訪問,spa
ES會在你繼續添加更多數據的時候在後臺清理已經標記爲刪除狀態的文檔。htm
ES局部更新blog
es爲何須要局部更新?索引
這個,從字面意思就知道,固然,不想所有更新時,好比一個指定類型下,不少個id,我不想每一個id都涉及等。
局部更新,能夠添加新字段或者更新已有字段(必須使用POST)
[hadoop@djt002 elasticsearch-2.4.3]$ curl -XGET 'http://192.168.80.200:9200/zhouls/emp/1?_source=name&pretty'
{
"_index" : "zhouls",
"_type" : "emp",
"_id" : "1",
"_version" : 3,
"found" : true,
"_source" : {
"name" : "tom"
}
}
[hadoop@djt002 elasticsearch-2.4.3]$ curl -XGET 'http://192.168.80.200:9200/zhouls/emp/1?_source=name,age&pretty'
{
"_index" : "zhouls",
"_type" : "emp",
"_id" : "1",
"_version" : 3,
"found" : true,
"_source" : {
"age" : 25,
"name" : "tom"
}
}
[hadoop@djt002 elasticsearch-2.4.3]$
[hadoop@djt002 elasticsearch-2.4.3]$ curl -XPOST 'http://192.168.80.200:9200/zhouls/emp/1/_update' -d '{"doc":{"name":"mack"}}'
{"_index":"zhouls","_type":"emp","_id":"1","_version":4,"_shards":{"total":2,"successful":1,"failed":0}}[hadoop@djt002 elasticsearch-2.4.3]$
[hadoop@djt002 elasticsearch-2.4.3]$
[hadoop@djt002 elasticsearch-2.4.3]$
[hadoop@djt002 elasticsearch-2.4.3]$ curl -XGET 'http://192.168.80.200:9200/zhouls/emp/1?_source=name&pretty'
{
"_index" : "zhouls",
"_type" : "emp",
"_id" : "1",
"_version" : 4,
"found" : true,
"_source" : {
"name" : "mack" 成功更改了name
}
}
[hadoop@djt002 elasticsearch-2.4.3]$ curl -XGET 'http://192.168.80.200:9200/zhouls/emp/1?pretty'
{
"_index" : "zhouls",
"_type" : "emp",
"_id" : "1",
"_version" : 4,
"found" : true,
"_source" : {
"name" : "mack",
"age" : 25
}
}
[hadoop@djt002 elasticsearch-2.4.3]$
總結:
ES所有更新,使用PUT或者POST
ES局部更新,使用POST
ES的所有更新和局部更新,底層有什麼區別?
答:所有更新,是直接把以前的老數據,標記爲刪除狀態,而後,再添加一條更新的。
局域更新,只是修改某個字段。