在ES中對索引文檔進行更新

簡介

ElasticSearch的文檔寫入是以不可修改的形式寫入的,一條文檔記錄一旦被寫入其本身就不能被修改了。然而祭阀,現(xiàn)實中存在修改這些數(shù)據(jù)的需求,那怎么辦呢鲜戒?當上帝給你關(guān)上一扇門的時候专控,他一定給你留了一個窗口。雖然我們不能直接修改這個文檔本身遏餐,但是我們可以通過更新一條_id一樣的文檔伦腐,并更新版本號的方式來修改這條記錄。我們可以通過三種姿勢進行更新失都。

姿勢1柏蘑,直接index

PUT test1/_doc/1
{
  "name": "bbbb"
}
# Do query
PUT test1/_doc/1
{
  "name": "bbbb",
  "age": 33
}
# Do query
PUT test1/_doc/1
{
  "name": "bbbb"
}
# Do query


按順序執(zhí)行上面的三條put操作幸冻,然后查詢,我們可以看到相應(yīng)的查詢結(jié)果是:

  "_version": 1
  "_source" : {
    "name" : "bbbb"
  }
  =========================
  "_version": 2
  "_source" : {
    "name" : "bbbb",
    "age" : 33
  }
  =========================
  "_version": 3
  "_source" : {
    "name" : "bbbb"
  }
  

可以看到每次put之后咳焚,版本號都會遞增1位洽损,同時后面的數(shù)據(jù)會覆蓋之前的數(shù)據(jù)。

如果我并不想每次都通過這樣把全部文檔內(nèi)容再輸入一次的形式來革半,而是希望基于前一個版本的文檔進行增減或者修改碑定,那又應(yīng)該怎么做呢。ES為我們提供了update API又官。

姿勢2延刘,使用update API

ES 提供了update API,使我們可以針對某個id的文檔赏胚,進行局部更新访娶。我們可以使用painless腳本或者直接在update中設(shè)置doc字段的參數(shù)的形式進行。

考慮以下文檔觉阅。

PUT test14/_doc/1
{
  "name": "aaaa",
  "age": 15,
  "sex": "male"
}

如果我想修改年齡的話崖疤,可以有兩種方法來進行:

POST test14/_update/1
{
  "doc": {
    "age": 14
  }
}

POST test14/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      ctx._source.age = 14
    """
  }
}

兩種方法都可以將age修改為14。

如果我們想增加一個屬性”weight“該怎么做呢典勇?

POST test14/_update/1
{
  "doc": {
    "weight": 90
  }
}

POST test14/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      ctx._source.weight = 90
    """
  }
}

如果我們想移除”sex“字段劫哼,這種情況下,只能用painless腳本了割笙。

POST test14/_update/1
{
  "script": {
    "lang": "painless",
    "source": """
      ctx._source.remove("sex");
    """
  }
}

這三種情況是最基本的权烧,還有一些其他用法,可以參考update的官方文檔伤溉。

https://www.elastic.co/guide/en/elasticsearch/reference/7.2/docs-update.html

需要注意般码,使用update api只能使用ES索引的內(nèi)置版本號,如果強行指定版本號乱顾,update操作會發(fā)生錯誤板祝。

上面兩種方法需要指定文檔id,ES還提供了基于search的update API走净,及update_by_query API券时。

姿勢3,使用update_by_query API

update_by_query API的第一種使用方式是什么都不指定伏伯,直接使用橘洞。

POST twitter/_update_by_query?conflicts=proceed

我一開始看到這種用法,覺得特別疑惑说搅,因為這樣做除了更新了版本號炸枣,似乎也沒有什么變化。后來讀了官方文檔才了解到這種用法的含義。

在設(shè)置索引配置的時候抛虏,有一個dynamic屬性博其,如果設(shè)置成false的話套才,如果碰到?jīng)]有事先映射過的字段迂猴,是不會做索引,搜索不到的背伴。需要注意沸毁,是搜索不到,但不是沒有存儲傻寂,這個數(shù)據(jù)還是在的息尺。那怎樣能使得這個數(shù)據(jù)能夠被索引到呢,這個時候update_by_query就能排上用場了疾掰。我們先更新這個索引的mapping搂誉,然后調(diào)用update_by_query API。對應(yīng)的文檔會重新索引一次静檬,之前不能搜索的字段就變得能夠被搜索到了炭懊。

和query API一樣,update_by_query也可以擁有一個query塊拂檩,作為update的條件出現(xiàn):

POST twitter/_update_by_query
{
  "script": {
    "source": "ctx._source.likes++",
    "lang": "painless"
  },
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}

同樣也可以使用painless進行update操作侮腹。

PUT _ingest/pipeline/set-foo
{
  "description" : "sets foo",
  "processors" : [ {
      "set" : {
        "field": "foo",
        "value": "bar"
      }
  } ]
}
POST twitter/_update_by_query?pipeline=set-foo

在進行update_by_query的時候,還可以指定pipeline稻励,使用pipeline的處理器處理文檔父阻。

還有一些其他用法,可以參考官方文檔:

https://www.elastic.co/guide/en/elasticsearch/reference/7.2/docs-update-by-query.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末望抽,一起剝皮案震驚了整個濱河市加矛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煤篙,老刑警劉巖斟览,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舰蟆,居然都是意外死亡趣惠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門身害,熙熙樓的掌柜王于貴愁眉苦臉地迎上來味悄,“玉大人,你說我怎么就攤上這事塌鸯∈躺” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涨颜。 經(jīng)常有香客問我费韭,道長,這世上最難降的妖魔是什么庭瑰? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任星持,我火速辦了婚禮,結(jié)果婚禮上弹灭,老公的妹妹穿的比我還像新娘督暂。我一直安慰自己,他們只是感情好穷吮,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布逻翁。 她就那樣靜靜地躺著,像睡著了一般捡鱼。 火紅的嫁衣襯著肌膚如雪八回。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天驾诈,我揣著相機與錄音缠诅,去河邊找鬼。 笑死翘鸭,一個胖子當著我的面吹牛滴铅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播就乓,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼汉匙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了生蚁?” 一聲冷哼從身側(cè)響起噩翠,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邦投,沒想到半個月后伤锚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡志衣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年屯援,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片念脯。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡狞洋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绿店,到底是詐尸還是另有隱情吉懊,我是刑警寧澤庐橙,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站借嗽,受9級特大地震影響态鳖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恶导,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一浆竭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甲锡,春花似錦兆蕉、人聲如沸羽戒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽易稠。三九已至缸废,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驶社,已是汗流浹背企量。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亡电,地道東北人届巩。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像份乒,于是被迫代替她去往敵國和親恕汇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容