ES中並不存在所謂的更新操作,而是用新文檔替換舊文檔;
在內部,Elasticsearch已經標記舊文檔為刪除並添加了一個完整的新文檔並建立索引。舊版本文檔不會立即消失
,但你也不能去訪問它
PUT /website/blog/123
{
"title": "My first blog entry2",
"text": "I am starting to get the hang of this...",
"date": "2014/01/02"
}
5.7.2:局部更新[partial _update]
上面介紹的是更新整個文檔,但是往往會出現這種情況,文檔非常大,但是只想更新其中的一個數據,這個時候通過檢索,修改,然后重建整文檔的索引方法來更新文檔就不合適了,所以需要使用局部的更新;
但是仍然需要注意的是,無論是整個文檔更新還是局部的更新,都是先找到舊的,然后標記刪除,然后在添加新的文檔
所以這個過程大概是這樣:
1. 從舊文檔中檢索JSON
2. 修改它
3. 刪除舊文檔
4. 索引新文檔
POST /website/blog/123/_update
{
"doc" : {
"tags" : [ "testing" ],
"views": 0
}
}
注意,在局部更新中,要使用POST + _update
5.7.3:使用腳本進行局部更新[Groovy]
這時候當API不能滿足要求時,Elasticsearch允許你使用腳本實現自己的邏輯。腳本支持非常多的API,例如搜索、排序、聚合和文檔更新。
默認的腳本語言是Groovy,一個快速且功能豐富的腳本語言,語法類似於Javascript。它在一個沙盒(sandbox)中運行,以防止惡意用戶毀壞Elasticsearch或攻擊服務器
腳本能夠使用update API改變source字段的內容,它在腳本內部以ctx.source表示。
例如,我們可以使用腳本增加博客的views數量:
POST /website/blog/123/_update
{
"script" : "ctx._source.views+=1"
}
5.7.4:更新可能不存的文檔
在局部更新操作中,如果遇到了不存在的文檔,會出現失敗的操作;
有時候也需要對不存在的文檔進行更新【創建】
POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1"
}
報錯: "type": "document_missing_exception" 因為當前並不存在這個文檔
使用關鍵字:upsert 當文檔不存在的時候,那么就創建這個文檔
POST /website/blog/1/_update
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 2
}
}
在局部更新中,使用upsert腳本:
當文檔不存在的時候,會走upsert語句 |
---|
當文檔已經存在的時候,會走script語句 |