六、ElasticSearch之groovy脚本执行partial update

es,其实是有个内置的脚本支持的,可以基于groovy脚本实现各种各样的复杂操作。

基于groovy脚本,如何执行partial update

准备数据

PUT /test_index/test_type/11
{
  "num": 0,
  "tags": []
}

(1)内置脚本

POST /test_index/test_type/11/_update
{
    "script": "ctx._source.num+=1"
}

{
    "_index": "test_index",
    "_type": "test_type",
    "_id": "11",
    "_version": 2,
    "found": true,
    "_source": {
        "num": 1,
        "tags": []
    }
}

(2)外部脚本,放在es的config/scripts下

编写脚本test-add-tags,内容如下:
ctx._source.tags+=new_tag

POST /test_index/test_type/11/_update
{
    "script": {
        "lang": "groovy",
        "file": "test-add-tags",
        "params": {
            "new_tag": "tag1"
        }
    }
}

(3)用脚本删除文档

ctx.op = ctx._source.num == count ? 'delete' : 'none'

POST /test_index/test_type/11/_update
{
    "script": {
        "lang": "groovy",
        "file": "test-delete-document",
        "params": {
            "count": 1
        }
    }
}

(4)upsert操作

文档不存在,报错
POST /test_index/test_type/11/_update
{"doc":{"num":1}}

如果指定的document不存在,就执行upsert中的初始化操作;如果指定的document存在,就执行doc或者script指定的partial update操作

POST /test_index/test_type/11/_update
{
    "script": "ctx._source.num+=1",
    "upsert": {
        "num": 0,
        "tags": []
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容