在 Elasticsearch 中文檔是 不可改變 的,不能修改它們。在我們對(duì)文檔進(jìn)行更新操作的時(shí)候,都會(huì)將舊文檔刪除,在原來(lái)的位置創(chuàng)建新的文檔.
更新整個(gè)文檔
UT /website/blog/123
{
"title": "My first blog entry",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}
{
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 2,
"created": false
}
我們會(huì)發(fā)現(xiàn)"_version"字段變成了2,這是因?yàn)檫@個(gè)字段標(biāo)志著版本號(hào),表示這是在這個(gè)index,這個(gè)type,這個(gè)id下,第二次存儲(chǔ)的數(shù)據(jù).
創(chuàng)建新文檔
因?yàn)閕ndex, type,id會(huì)唯一標(biāo)識(shí)的一個(gè)文檔,當(dāng)我們給出了相同的index,type,id時(shí),這不會(huì)創(chuàng)建新的文檔,而是刪除存在的文檔,將新的JSON文檔存儲(chǔ)在這個(gè)命名空間里.
- 使用POST /index/type/,elasticsearch會(huì)自動(dòng)為我們創(chuàng)建一個(gè)唯一的id
POST /website/blog/
{ ... }
在指定的index,type,id創(chuàng)建文檔,如果指定的命名空間里沒(méi)有文檔則創(chuàng)建,有則報(bào)錯(cuò)。
- 使用op_type參數(shù)(optype=create)
PUT /website/blog/123?op_type=create
{ ... }
- 第二種方法是在 URL 末端使用 /_create.
PUT /website/blog/123/_create
{ ... }
刪除文檔
- 刪除指定的文檔
DELETE /website/blog/123
{
"found" : true,
"_index" : "website",
"_type" : "blog",
"_id" : "123",
"_version" : 3
}
需要注意的是: _version字段的值加了1,表示這個(gè)index,type,id表示的命名空間執(zhí)行了3次操作,即使文檔不存在, _version 值仍然會(huì)增加。這是 Elasticsearch 內(nèi)部記錄本的一部分,用來(lái)確保這些改變?cè)诳缍喙?jié)點(diǎn)時(shí)以正確的順序執(zhí)行
處理沖突
有時(shí)候,在進(jìn)行并行處理的時(shí)候可能會(huì)出現(xiàn)沖突,如下所示:

解決方法:
- 悲觀并發(fā)控制
這種方法被關(guān)系型數(shù)據(jù)庫(kù)廣泛使用,它假定有變更沖突可能發(fā)生,因此阻塞訪問(wèn)資源以防止沖突。 一個(gè)典型的例子是讀取一行數(shù)據(jù)之前先將其鎖住,確保只有放置鎖的線程能夠?qū)@行數(shù)據(jù)進(jìn)行修改。
- 樂(lè)觀并發(fā)控制
Elasticsearch 中使用的這種方法假定沖突是不可能發(fā)生的,并且不會(huì)阻塞正在嘗試的操作。 然而,如果源數(shù)據(jù)在讀寫(xiě)當(dāng)中被修改,更新將會(huì)失敗。應(yīng)用程序接下來(lái)將決定該如何解決沖突。 例如,可以重試更新、使用新的數(shù)據(jù)、或者將相關(guān)情況報(bào)告給用戶。