1. 程式人生 > >Elasticsearch 文件更新操作

Elasticsearch 文件更新操作

正如我們提到的,文件不能被修改,它們只能被替換掉。更新API也必須遵循這一法則。從表面看來,貌似是文件被替換了。對內而言,它必須按照找回-修改-索引的流程來進行操作與管理。不同之處在於這個流程是在一個片(shard) 中完成的,因此可以節省多個請求所帶來的網路開銷。除了節省了步驟,同時我們也能減少多個程序造成衝突的可能性。

使用更新請求最簡單的一種用途就是新增新資料。新的資料會被合併到現有資料中,而如果存在相同的欄位,就會被新的資料所替換。例如我們可以為我們的employee新增tags和views欄位:
curl -XPOST "http://localhost:9200/megacorp/employee/1/_update"
-d ' { "doc" : { "tags" : [ "testing" ], "views": 0 } }'

如果請求成功,我們就會收到一個類似於索引時返回的內容:

{
    "_index": "megacorp",
    "_type": "employee",
    "_id": "1",
    "_version": 21,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed
": 0 }
}

再次取回資料,你可以在_source中看到更新的結果:

{
  "_index" : "megacorp",
  "_type" : "employee",
  "_id" : "1",
  "_version" : 21,
  "found" : true,
  "_source" : {
    "first_name" : "John",
    "last_name" : "Aires",
    "age" : 24,
    "about" : "I love to go rock climbing",
    "interests" : [
      "sports"
, "food" ]
, "views" : 0, "tags" : [ "testing" ] }
}
新的資料已經新增到了欄位_source中。

更新一篇可能不存在的文件

想象一下,我們可能需要在Elasticsearch中儲存一個頁面計數器。每次使用者訪問這個頁面,我們就增加一下當前頁面的計數器。但是如果這是個新的頁面,我們不能確保這個計數器已經存在。如果我們試著去更新一個不存在的文件,更新操作就會失敗。

為了防止上述情況的發生,我們可以使用upsert引數來設定文件不存在時,它應該被建立:
curl -XPOST "http://localhost:9200/megacorp/employee/1/_update" -d '
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 1
   }
}'
首次執行這個請求時,upsert的內容會被索引成新的文件,它將views欄位初始化為1。當之後再請求時,文件已經存在,所以指令碼更新就會被執行,views計數器就會增加。

更新和衝突

在本節的開篇我們提到了當取回與重新索引兩個步驟間的時間越少,發生改變衝突的可能性就越小。但它並不能被完全消除,在更新的過程中還可能存在另一個程序進行重新索引的可能性。

為了避免丟失資料,更新API會在獲取步驟中獲取當前文件中的_version,然後將其傳遞給重新索引步驟中的索引請求。如果其他的程序在這兩部之間修改了這個文件,那麼_version就會不同,這樣更新就會失敗。

對於很多的區域性更新來說,文件有沒有發生變化實際上是不重要的。例如,兩個程序都要增加頁面瀏覽的計數器,誰先誰後其實並不重要 —— 發生衝突時只需要重新來過即可。

你可以通過設定retry_on_conflict引數來設定自動完成這項請求的次數,它的預設值是0。
curl -XPOST "http://localhost:9200/megacorp/employee/1/_update?retry_on_conflict=5 <1>" -d '
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 0
   }
}
失敗前重新嘗試5次

這個引數非常適用於類似於增加計數器這種無關順序的請求,但是還有些情況的順序就是很重要的。例如上一節提到的情況,你可以參考樂觀併發控制以及悲觀併發控制來設定文件的版本號。

相關推薦

Elasticsearch 更新操作

正如我們提到的,文件不能被修改,它們只能被替換掉。更新API也必須遵循這一法則。從表面看來,貌似是文件被替換了。對內而言,它必須按照找回-修改-索引的流程來進行操作與管理。不同之處在於這個流程是在一個片

MongoDB更新操作

我們在前面的文章中提到過文件的基本的增刪改查操作,MongoDB中提供的增刪改查的語法非常豐富,本文我們主要來看看更新都有哪些好玩的語法。 本文是MongoDB系列的第四篇文章,瞭解前面的文章有助於更好的理解本文: 文件替換 假設我

ElasticSearch 操作

> **公號:碼農充電站pro** > **主頁:** 本節介紹 ES 文件,索引及其基本操作。 ### 1,ES 中的文件 在 ES 中,**文件**(Document)是可搜尋資料的最小儲存單位,相當於關係資料庫中的一條記錄。 文件以 **Json** 資料格式儲存在 ES 中,Json 中儲存著

Elasticsearch學習(四)CRUD操作

叢集管理 (1)快速檢查叢集的健康狀況 GET /_cat/health?v (2)快速檢視叢集中有哪些索引 GET /_cat/indices?v (3)簡單的索引操作 建立索引: PUT /test_index?pretty 刪除索引: DELE

ElasticSearch學習筆記十七 更新及版本控制

文件更新 在 Elasticsearch 中文件是 不可改變 的,不能修改它們。相反,如果想要更新現有的文件,需要 重建索引。但是我們不需要自己來完成操作,Update API 會幫我們完成。 例如我們新插入一條紀錄 PUT /website/blog/1 {

Easticsearch官網《Elasticsearch權威指南》筆記2——基本操作

建立文件 PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "

Solr 18 - 通過SolrJ區域性更新Solr中的 (原子操作、非覆蓋操作)

目錄 1 需求分析 2 需求實現 2.1 pom.xml依賴 2.2 Java程式碼示例 3 補充說明 3.1 關於文件中_version_的取值說明

ElasticStack學習(四):ElasticSearch使用與操作

一、文件的CRUD介紹 ElasticSearch中存在五種操作,分別如下: 1、Index 該操作表示:如果文件的ID不存在,則建立新的文件。若有相同的ID,先刪除現有文件,然後再建立新的文件,同時版本會增加。 語法格式如下: PUT index_name/_doc/100 {"field1

關於Elasticsearch的描述以及如何操作的詳細總結

文件 什麼是文件 在大多數應用中,多數實體或物件可以被序列化為包含鍵值對的 JSON 物件。 一個 鍵 可以是一個欄位或欄位的名稱,一個 值 可以是一個字串,一個數字,一個布林值, 另一個物件,一些陣列值,或一些其它特殊型別諸如表示日期的字串,或代表一個地理位置的物件: { "name&qu

linux基本操作管理

基本操作 基本 mov 交互 使用 操作 強制 復制文件 遞歸 復制文件、目錄 1、使用cp(copy的意思)命令復制文件或者目錄   cp源文件(文件夾)目標文件(文件夾) 常用參數:   -r 遞歸復制整個目錄樹(復制文件夾用)   -v顯示詳細信息 2、使用mv(m

5-21操作

註意 r+ nbsp 末尾 添加 int odi 讀取 不能 1、打開文件 文件的三種打開模式,如果open時不指定模式,則默認以讀模式打開 w,寫 但是不能讀。註意用該方式打開文件後會先將文件中原來的內容清掉,再寫入指定的內容。用該模式要慎重,因為一旦打開文件,內容將被清

內容操作類-RandomAccessFile

dom ack 個數 參數 ces ring and div pack package randomaccessfile.cn; import java.io.File; import java.io.FileNotFoundException; import java

Python+Django+js+echarts引入本地js操作方法

div com log asc run 避免 repl mage script 1. 選擇正確的echarts.js,開發版選擇echarts.baidu.com上的源碼版,避免出現問題 2. 在項目主目錄中新建static文件夾,裏面建立js、css、images文件夾

sed應用 升級場景配置更新 指定行追加

pan port rep func res list class strong lin function addLine() { confFile=configuration.xml isExist=`cat ${confFile} | grep "<liste

Python基礎之操作

指定 名稱 讀取 內容 ont 依次 操作 print 文件 #文件的操作#創建文件fc=open("E:/新建文件夾/a.mp8","w")#參數1表示文件路徑以及名稱,參數2表示文件的操作方法fc=file("E:/新建文件夾/a.mp9","w")#打開文件fo=op

python2.7.13標準庫目錄操作操作

mov abs 庫文件 shell htm .com 及其 rec lose 標準庫的中文參考文檔: http://python.usyiyi.cn/translate/python_278/library/index.html 官方標準庫文檔:https://docs.p

js更新後,解決本地緩存引起的沖突

app text javascrip type script 時間 更新 sep base 在加載的引用的JS文件後面加上時間。例如: <script type="text/javascript" src="<%=ApplicationContextUti

TortoiseSVN操作

名稱 中文 images 版本 導入 修改 目錄 src 客戶 (1).安裝SVN·客戶端 (2) 建立庫: 1、新建文件夾,目錄和文件夾名稱最好都用英文,不要使用中文; 2、打開文件夾,在空白處按下“shift鍵+鼠標右鍵”; 3、在彈出的菜單中選擇“TortoiseSV

Pthon 操作

Coding code pthon line nco blog utf-8 lose odin #文件寫模式f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)#文件寫f.write(‘11111\n‘)f.write(‘2222\n‘)f.writ

PHP系統操作常用函數

調用 name del 菜鳥 global lena 格式化 類型 lose 雖然PHP提供很多內置的文件處理函數,但是分得特別細,有一些操作需要多個函數一起使用才能達到目標,比如刪除非空文件夾的所有內容,遍歷文件夾等功能,下面各個函數是學習的時候整理的,有的是教程裏的,有