- 簡(jiǎn)單字段更新
- 使用腳本按條件更新
- 使用更新api創(chuàng)建或刪除文檔
歡迎訪問本人博客:http://wangnan.tech
為什么我們無法真的更新索引中的文檔
在索引一個(gè)新文檔的時(shí)候,lucene會(huì)對(duì)每個(gè)字段進(jìn)行分析并產(chǎn)生詞條流,詞條流中的詞條可以會(huì)經(jīng)過過濾器的額外處理,而沒有過濾掉的詞條會(huì)寫入倒排索引中,索引過程中,一些不需要的信息可能被拋棄,這些信息包括:
- 某些特殊的詞條位置(當(dāng)詞向量沒有儲(chǔ)存時(shí))
- 特定詞匯(停用詞或同義詞)
- 詞條的變形(如詞干還原)
因此我們無法更新索引中的文檔,而且每次修改時(shí)不得不向索引發(fā)送文檔所有字段數(shù)據(jù)
_source
elasticsearch可以通過使用_source偽字段儲(chǔ)存和檢索文檔的原始數(shù)據(jù)來解決這個(gè)問題,當(dāng)用戶需要更改文檔時(shí),elasticsearch會(huì)獲取_soucre字段中的值,做相應(yīng)的修改,然后向索引提交一個(gè)新文檔,替換老文檔
為了使得這個(gè)特征起效,_source字段必須是可用的
局限
更新命令的一個(gè)很大的局限就是它只能更新單個(gè)文檔,目前還不支持通過查詢實(shí)現(xiàn)批量更新
更新api
文檔更新可以通過執(zhí)行發(fā)送至端點(diǎn)的更新請(qǐng)求來實(shí)現(xiàn),也可以通過在更新請(qǐng)求的url中添加_update參數(shù)來更新某個(gè)特定的文檔
比如 /library/book/_update
本文其余部分都將使用下面命令索引的文檔:

簡(jiǎn)單字段更新
使用下面命令
curl -XPOST localhost:9200/library/book/1/_update -d'{
"doc":{
"title":"The Complete Sherlock Homes Book"
"year":1935
}
}
作為響應(yīng),elasticsearch將返回一個(gè)與建索引操作類似的回復(fù):
{"ok":true,"_index":"library","_type":"book","_id":"1","_version"2}
現(xiàn)在,如果我們想從索引獲取剛才修改的文檔是否被修改了,可以執(zhí)行下面的命令:
curl -xGET localhost:9200/library/book/1?pretty
改命令響應(yīng)如下:

可以看到_source字段中的值已經(jīng)被修改了
使用腳本按條件更新
有時(shí)候在修改文檔的時(shí)候添加一些額外的邏輯是很有好處的
例如我們發(fā)送下面的請(qǐng)求:

ctx變量來引用源文檔
使用更新api創(chuàng)建或刪除文檔
更新api不僅僅可以修改文檔,也可以用來操作整個(gè)文檔
upsert屬性允許用戶在當(dāng)url中地址不存在時(shí)創(chuàng)建一個(gè)新文檔
查看下面命令:

該命令修改了某個(gè)已有的文檔year字段,如果文檔不存在,將會(huì)創(chuàng)建一個(gè)文檔,并且該文檔會(huì)創(chuàng)建一個(gè)新字段title
前面的命令還可以使用腳本重寫為以下形式

有條件的移除整個(gè)文檔:

(注:內(nèi)容整理自《深入理解Elasticsearch》)