es之對文檔進行更新操作


5.7.1:更新整個文檔

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語句


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM