一、什么是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. linux下 vi命令编辑/etc/my.cnf

    把my.cnf配置文件加个max_connections包括(插入命令,删除命令,修改命令.退出保存命令) 你要有这个文件写权限,shell下输入: vi /etc/my.cnf 进入vi后,按i移动 ...

  2. Vue项目中,要保证某个部分的高度,应该怎么设置

    .icons overflow: hidden height: padding-bottom: % background: green

  3. 清北-Day5-R2-divide

    题目描述 问是否可以将一个仅由0~9组成的字符串划分成两个或两个以上部分,使得每一部分的数字总和相等. 输入 输入文件名为 \(divide.in\) 多组数据,第一行一个数\(n\),表示数据组数 ...

  4. IO多路复用注解

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 客户端import socket obj = socket.socket()obj.connect((&qu ...

  5. Python-uiautomator使用说明文档

    https://github.com/xiaocong/uiautomator 这个Python库是基于Android自带的uiautomator测试框架的一个python封包.适用于Android ...

  6. Telsa显卡比较

    1. T4 2. P4/ P40 3. P100 4. V100

  7. Petrozavodsk Winter-2018. Carnegie Mellon U Contest

    A. Mines 每个点能爆炸到的是个区间,线段树优化建图,并求出SCC进行缩点. 剔除所有不含任何$n$个点的SCC之后,最小代价为每个入度为$0$的SCC中最小点权之和,用set维护即可. 时间复 ...

  8. 修改Ueditor的图片上传地址

    文件地址:ueditro/php/config.json /* 前后端通信相关的配置,注释只允许使用多行方式 */ { /* 上传图片配置项 */ "imageActionName" ...

  9. 搜素题 --java

    Poj2531 首先把所有节点都放在一组,然后采用深度优先搜索的方法,对每一个节点都做判断是否应该移到另一组去,判断的依据是移过去和不移过去哪个得到的和值比较大(这里移去B组后的计算方法就是加上该点和 ...

  10. CXF安装和配置时出现Exception in thread "main" java.lang.UnsupportedClassVersionError:异常?

    异常信息: C:\Users\>wsdl2java -h Exception in thread "main" java.lang.UnsupportedClassVersi ...