一、什么是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. Hibernate查询返回自定义VO的两种方式

    说明:createQuery用的hql语句进行查询,createSQLQuery用sql语句查询: 前者以hibernate生成的Bean为对象装入list返回:后者则是以对象数组进行存储: 一.通过 ...

  2. es2015 解构赋值

    解构赋值语法是一个 Javascript 表达式,这使得可以将值从数组或属性从对象提取到不同的变量中.

  3. C# 微信开发-----微信会员卡(三)激活会员卡

    在会员领取了会员卡之后需要做 一个跳转性激活,模式请看下图: 在创建会员卡的时候需要配置下这个参数的值: memberActivate.aspx页面代码如下: <%@ Page Language ...

  4. Python-Django基础

    django目录 -settings -urls -views ******强调:setting中'django.middleware.csrf.CsrfViewMiddleware'中间件先注释掉 ...

  5. Xcode注释快捷键和Alfred 快捷键冲突解决方案

    在Alfred 中的Features -> File Search ->Navigation ->Previous Path 中的快捷方式改掉就可以了

  6. 强大的IDEA开发工具

    开发工具切换IDEA 一:首先安装好IDEA工具并且配置maven信息 打开-File-Settings 新建maven WEB项目 打开-File-New-Project 点击NEXT 点击NEXT ...

  7. 金蝶K/3 BOS产品培训教案

    K/3 BOS产品培训教案     1 K/3 BOS IDE练习案例... 2 1.1新建基础资料... 2 1.1.1新增基础资料交货地点... 2 1.2新建业务单据... 2 1.2.1新建寄 ...

  8. hihocoder 1496 寻找最大值

    题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai\&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行 ...

  9. WEB测试重点

    1.功能测试:所实现的功能是否和需求一致:2.界面测试:界面是否美观,风格是否一致,文字内容是否正确:3.链接测试:打开链接速度是否合理:是否链接到正确的页面:是否有空白页面:4.性能测试:系统能支持 ...

  10. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果