一、什么是partial
update?


PUT
/index/type/id,创建文档&替换文档,就是一样的语法

一般对应到应用程序中,每次的执行流程基本是这样的:

(1)应用程序先发起一个get请求,获取到document,展示到前台界面,供用户查看和修改
(2)用户在前台界面修改数据,发送到后台
(3)后台代码,会将用户修改的数据在内存中进行执行,然后封装好修改后的全量数据
(4)然后发送PUT请求,到es中,进行全量替换
(5)es将老的document标记为deleted,然后重新创建一个新的document

partial update

POST
/index/type/id/_update
{
   "doc":
{
      "要修改的少数几个field即可,不需要全量的数据"
   }
}

PUT
/test_index/test_type/10
{
  "test_field1":
"test1",
  "test_field2":
"test2"
}

POST
/test_index/test_type/10/_update
{
  "doc":
{
    "test_field2":
"updated test2"
  }
}

看起来,好像就比较方便了,每次就传递少数几个发生修改的field即可,不需要将全量的document数据发送过去

二、partial
update实现原理以及其优点


          partial
update直接将数据更新到document中就完成了修改,不用事先先发起一个GET请求数据进行修改然后在将修改后的数据发回去。
          es内部:partial update的执行和全量替换一致。
                        (1)内部先get获取document
                        (2)将更新的field更新到document的json中
                        (3)将老的document标记为deleted
                        (4)创建新的document
          优点:
                (1)所有查询,修改和写回操作均发生在同一个shard内,避免了不必要的网络数据传输带来的开销,大大提升了性能(减少了两次请求,一次GET请求,一次回写请求)
                (2)减少修改和查询中的时间间隔,有效减少并发冲突的情况
                (3)内置乐观锁并发控制

                         POST
/test_index/test_type/id/_update?retry_on_conflict=2
{
  "doc":
{
    "num":32
  }
}
如果更新失败,则获取最新的版本号再次进行更新,最多重试retry_on_conflict指定的次数
                        POST
/test_index/test_type/11/_update?version=3
{
  "doc":
{
    "num":32
  }
}

三、基于groovy脚本的partial
update


1、内置脚本

             示例:
                        PUT
/test_index/test_type/11
{
  "num":0,
  "tags":[]
}
              更新num字段:
                POST
/test_index/test_type/11/_update
{
  "script":
"ctx._source.num+=8"
}

2、外部脚本


                    在Elasticsearch的安装目录下的\config\scripts内添加指定的groovy脚本

  (1)添加脚本
test_update_num.groovy

                     脚本代码:
                               ctx._source.num+=1
                      执行脚本:
                        POST
/test_index/test_type/11/_update
{
  "script":
{
    "lang":
"groovy",
    "file":
"test_update_num"
  }
}



2)
添加脚本:test-add-tags.groovy

                     脚本代码:ctx._source.tags+=new_tag
                     执行脚本:
                                    POST
/test_index/test_type/11/_update
{
  "script":
{
    "lang":
"groovy",
    "file":
"test-add-tags",
    "params":
{
      "new_tag":"tag_value"
    }
  }
}


3)
添加脚本:test-delete-document.groovy

                     脚本代码:
                                ctx.op=ctx._source.num==count?"delete":'none'
                     执行脚本:
POST
/test_index/test_type/11/_update
{
  "script":
{
    "lang":
"groovy",
    "file":
"test-delete-document",
    "params":
{
      "count":17
    }
  }
}

(4)upsert操作


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

POST
/test_index/test_type/11/_update
{
   "script" :
"ctx._source.num+=1",
   "upsert":
{
       "num":
0,
       "tags":
[]
   }

}
   





Elasticsearch学习笔记(九)partial update的更多相关文章

  1. Elasticsearch学习笔记一

    Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...

  2. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  3. elasticsearch学习笔记——相关插件和使用场景

    logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格 ...

  4. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  5. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  6. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  7. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  8. ElasticSearch学习笔记(超详细)

    文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...

  9. Python学习笔记九

    Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...

随机推荐

  1. 【easy】349. Intersection of Two Arrays

    找两个数组的交集(不要多想,考虑啥序列之类的,就是简单的两堆数求交集啊!!!最后去个重就好了) //LeetCode里用到很多现成函数的时候,苦手だな- //这个题的思路是,先sort,把两个vect ...

  2. 通过fiddler和逍遥模拟器模拟抓包android手机

    环境说明 Fiddler/逍遥手机模拟器 安装在10.11.0.148的电脑中 逍遥模拟器会自动生成wifi连接到 10.11.0.148上网 开启https: 在模拟器中打开 http://代理:8 ...

  3. [C]\x字符转义序列

    概述       \x转义的定义是这样的 转义符 字符值 输出结果 \xh[h...] 具有此十六进制码的字符 输出此字符 问题      看似\x后面可以接受1或n个十六进制的字符,但是如果你把一个 ...

  4. sklearn.linear_model.LinearRegresion学习

    sklearn线性模型之线性回归 查看官网 https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearR ...

  5. 【由浅入深理解java集合】(四)——集合 Queue

    今天我们来介绍下集合Queue中的几个重要的实现类.关于集合Queue中的内容就比较少了.主要是针对队列这种数据结构的使用来介绍Queue中的实现类. Queue用于模拟队列这种数据结构,队列通常是指 ...

  6. springboot配置详解

    springboot配置详解 Author:SimpleWu properteis文件属性参考大全 springboot默认加载配置 SpringBoot使用两种全局的配置文件,全局配置文件可以对一些 ...

  7. docker 中打包部署Springboot项目

    1.安装jdk yum -y install java-1.8.0-openjdk* 2.安装并启动mysql mysql高版本驱动变了,最后还是安装5.6 docker pull mysql:5.6 ...

  8. “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。

    如果你的 WebService 客户端证书配置都没问题,唯独调用接口会出现这个错误 “System.FormatException”类型的未经处理的异常在 System.IdentityModel.d ...

  9. jmeter的基本功能使用详解

    jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简 单.因为jmeter是java开发的,所以运行的时候必须先要 ...

  10. rho

    bigint pollard_rho(bigint C, bigint N) //返回一个平凡因子 { bigint I, X, Y, K, D; I = 1; X = Y = rand() % N; ...