跟我學(xué)Elasticsearch(10) partial update的原理和使用

[Toc]

1、什么是partial update?

我們用document的全量替換來(lái)對(duì)比一下partial update。全量替換時(shí),我們需要把document里的所有field給到es進(jìn)行替換,而partial update只需要把document id和需要更新的部分字段給到es就行,兩種方式對(duì)document的修改結(jié)果是一樣的。

既然如此那為何還要用partial update呢?我畫(huà)個(gè)圖對(duì)比下

image

我們可以直觀的看到全量替換document時(shí),如果document過(guò)大,會(huì)占用更多網(wǎng)絡(luò)帶寬和磁盤(pán)io,因此整個(gè)查詢更新的時(shí)間間隔會(huì)更長(zhǎng),產(chǎn)生并發(fā)沖突(留到下一篇講)的幾率也會(huì)更大。

事實(shí)上全量替換和partial update兩種方式都需要先查詢?nèi)縟ocument后全量寫(xiě)入的,全量替換的方式是由我們程序查詢后再寫(xiě)入,而partial update的方式全量查詢和全量寫(xiě)入都是發(fā)生在es一個(gè)shard內(nèi)部,避免了網(wǎng)絡(luò)開(kāi)銷(xiāo),也有效減少了并發(fā)沖突。

2、partial update如何使用

先寫(xiě)入一條測(cè)試數(shù)據(jù)

PUT /product/book/1
{
  "product_name": "yuwen shu",
  "num": 10
}

用全量替換的方式進(jìn)行更新test_field2字段是這樣的

PUT /product/book/1
{
  "product_name": "yuwen shu",
  "num": 11
}

而用partial update更新test_field2字段是這樣的

POST /product/book/1/_update
{
  "doc": {
    "num": 12
  }
}

3、基于groovy腳本進(jìn)行partial update

es有個(gè)內(nèi)置的腳本支持,可以基于groovy腳本進(jìn)行各種復(fù)雜操作,那么基于groovy腳本怎么進(jìn)行partial update呢

POST /product/book/1/_update
{
   "script" : "ctx._source.num+=1"
}
image

此時(shí)num變成了12+1=13

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容