ElasticSearch 7.x 实战入门07

作者: 众神开挂 | 来源:发表于2020-03-24 09:56 被阅读0次

    主要讲解的内容: 部分更新,包括_update和script脚本两种方式

    1、基于_update的partial update

    1.1、_update实战

    每次就传递少数几个发生修改的field即可,不需要将全量的document数据发送过去

    #伪代码
    POST index/_update/id
    {
      "doc": {
        "field":"data"
      }
    }
    

    更新示例:

    POST test_index/_update/7
    {
      "doc": {
        "title":"xiaomi"
      }
    }
    
    1.2、实现原理以及其优点

    ES内部对partial update的实际执行,跟传统的全量替换方式,是几乎一样的
    1、内部先获取document
    2、将传过来的field更新到document的json中
    3、将老的document标记为deleted
    4、将修改后的新的document创建出来

    partial update相较于全量替换的优点
    1、所有的查询、修改和写回操作,都发生在es中的一个shard内部,避免了网络数据传输的开销(减少2次网络请求) , 大大提升了性能。
    2.减少了查询和修改中的时间间隔,可以大大减少并发冲突的情况。

    2、基于script脚本的partial update

    2.1、基于内部脚本的更新字段

    通过脚本更新制定字段,其中ctx是脚本语言中的一个执行对象,先获取_source,再修改price字段

    POST /ecommerce/_update/1
    {
      "script": {
        "source": "ctx._source.price += params.price",
        "params": {
          "price": 4
        }
      }
    }
    
    2.2、基于外部脚本的更新

    在 ES安装目录/config/scripts目录下创建groovy文件 ( 该方法已过时了)

    使用 _script在ES中创建脚本ecommerce_add_tags

    POST _scripts/ecommerce_add_tags
    {
      "script": {
        "lang": "painless",
        "source": "ctx._source.price += params.price"
      }
    }
    

    _scripts脚本的简单管理

    查看:GET _scripts/ecommerce_add_tags
    删除:DELETE _scripts/ecommerce_add_tags
    

    使用id引用外部脚本更新document

    POST /ecommerce/_update/1
    {
      "script": {
        "id": "ecommerce_add_tags",
        "params": {
          "price": 6
        }
      }
    }
    
    添加字段

    与修改字段类似

    POST ecommerce/_update/1
    {
      "script": {
        "source": "ctx._source.add=34"
      } 
    }
    

    删除字段

    POST ecommerce/_update/1
    {
      "script": {
        "source":"ctx._source.remove(\"add\")"
      }
    }
    

    删除文档

    POST /ecommerce/_update/1
    {
      "script": {
        "source": "ctx.op = ctx._source.price == params.price ? 'delete' : 'none'",
        "params": {
          "price": 66
        }
      }
    }
    

    3、upsert 操作

    如果指定的document不存在,就执行upsert中的初始化操作;

    如果指定的document存在,就执行doc或者script指定的partial update操作

    POST /ecommerce/_update/1
    {
      "doc": {
        "price": 1
      },
      "upsert": {
        "name": "jiajieshi yagao",
        "desc": "youxiao fangzhu",
        "price": 25,
        "producer": "jiajieshi producer",
        "tags": [
          "fangzhu"
        ]
      }
    }
    

    相对于之前的使用upsert中的内容添加到不存在的文档,使用doc_as_upsert可以在文档不存在的时候,把doc中的内容插入到文档中。

    POST /ecommerce/_update/8
    {
      "doc": {
        "price": 1
      },
      "doc_as_upsert": true
    }
    

    注意

    更新操作是不支持外部版本号

    partial update内置乐观锁并发控制,代码如下:

    POST /ecommerce/_update/1?if_seq_no=38&if_primary_term=4
    {
      "script": {
        "id": "ecommerce_add_tags",
        "params": {
          "price": 66
        }
      }
    }
    

    参考文章:

    ES 27 - Elasticsearch的脚本使用实践 - 瘦风 - 博客园 https://www.cnblogs.com/shoufeng/p/11360177.html

    Elasticsearch增删改查 之 —— Update更新 - xingoo - 博客园 https://www.cnblogs.com/xing901022/p/5330778.html

    How to use scripts | Elasticsearch Reference [7.x] | Elastic https://www.elastic.co/guide/en/elasticsearch/reference/7.x/modules-scripting-using.html

    Painless API Reference | Painless Scripting Language [7.x] | Elastic https://www.elastic.co/guide/en/elasticsearch/painless/7.x/painless-api-reference.html#painless-api-reference

    相关文章

      网友评论

        本文标题:ElasticSearch 7.x 实战入门07

        本文链接:https://www.haomeiwen.com/subject/qeopyhtx.html