1、什么是partial update旺坠?
- 如果使用 PUT /index/type/id 這樣的方式進行創(chuàng)建文檔和替換文檔乔遮,就是一樣的語法。
- 一般對應(yīng)到應(yīng)用程序中取刃,每次的執(zhí)行流程基本是這樣的:
(1)應(yīng)用程序先發(fā)起一個get請求蹋肮,獲取到document,展示到前臺界面璧疗,供用戶查看和修改
(2)用戶在前臺界面修改數(shù)據(jù)坯辩,發(fā)送到后臺
(3)后臺代碼,會將用戶修改的數(shù)據(jù)在內(nèi)存中進行執(zhí)行崩侠,然后封裝好修改后的全量數(shù)據(jù)
(4)然后發(fā)送PUT請求漆魔,到es中,進行全量替換
(5)es將老的document標記為deleted,然后重新創(chuàng)建一個新的document
partial update則是使用POST方式進行修改
post /index/type/id/_update
{
"doc": {
"要修改的少數(shù)幾個field即可改抡,不需要全量的數(shù)據(jù)"
}
}
看起來矢炼,好像就比較方便了,每次就傳遞少數(shù)幾個發(fā)生修改的field即可阿纤,不需要將全量的document數(shù)據(jù)發(fā)送過去
2句灌、圖解partial update實現(xiàn)原理以及其優(yōu)點
3. 實戰(zhàn)演練
#全量替換
PUT /test_index/test_type/10
{
"test_field1": "test1",
"test_field2": "test2"
}
#partial update
POST /test_index/test_type/10/_update
{
"doc": {
"test_field2":"updated test2"
}
}
4. 基于groovy腳本執(zhí)行partial update
es中其實是有個內(nèi)置的腳本支持的,可以基于groovy腳本實現(xiàn)各種各樣的復(fù)雜操作欠拾,這里介紹基于groovy腳本胰锌,如何執(zhí)行partial update
- 首先創(chuàng)建出一條數(shù)據(jù)
PUT /test_index/test_type/11
{
"num":0,
"tags":[]
}
(1)內(nèi)置腳本
POST /test_index/test_type/11/_update
{
"script": "ctx._source.num+=1"
}
#查詢
GET /test_index/test_type/11
#返回
{
"_index": "test_index",
"_type": "test_type",
"_id": "11",
"_version": 2,
"found": true,
"_source": {
"num": 1,
"tags": []
}
}
(2)外置腳本
在es安裝目錄下的config文件下的scripts文件新建一個腳本文件: test-add-tags.groovy
#在test-add-tags.groovy文件中添加以下內(nèi)容
ctx._source.tags+=new_tag
- 然后在kibana控制臺中進行測試
#運行腳本文件
POST /test_index/test_type/11/_update
{
"script": {
"lang": "groovy",
"file": "test-add-tags",
"params": {
"new_tag":"tag1"
}
}
}
#查詢
GET /test_index/test_type/11
#返回
{
"_index": "test_index",
"_type": "test_type",
"_id": "11",
"_version": 3,
"found": true,
"_source": {
"num": 1,
"tags": [
"tag1"
]
}
}
(3)用腳本刪除文檔
新建一個 test-delete-document.groovy 腳本文件,并添加以下內(nèi)容
ctx.op = ctx._source.num == count ? 'delete' : 'none'
- 然后在kibana控制臺中進行測試
#運行腳本文件
POST /test_index/test_type/11/_update
{
"script": {
"lang": "groovy",
"file": "test-delete-document",
"params": {
"count":1
}
}
}
#查詢
GET /test_index/test_type/11
#返回
{
"_index": "test_index",
"_type": "test_type",
"_id": "11",
"found": false
}
(4)upsert操作
如果在執(zhí)行修改的情況下該document已經(jīng)不存在了清蚀,就執(zhí)行upsert中的初始化操作匕荸;如果指定的document存在,就執(zhí)行doc或者script指定的partial update操作
POST /test_index/test_type/11/_update
{
"script": "ctx._source.num+=1",
"upsert": {
"num":0,
"tags":[]
}
}
#查詢
GET /test_index/test_type/11
#返回
{
"_index": "test_index",
"_type": "test_type",
"_id": "11",
"_version": 1,
"found": true,
"_source": {
"num": 0,
"tags": []
}
}