[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ì)比下

我們可以直觀的看到全量替換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"
}

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