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提供很多內置的文件處理函數,但是分得特別細,有一些操作需要多個函數一起使用才能達到目標,比如刪除非空文件夾的所有內容,遍歷文件夾等功能,下面各個函數是學習的時候整理的,有的是教程裏的,有