Elasticsearch学习笔记(九)partial update

一、什么是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":
[]

   }

}

原文地址:https://www.cnblogs.com/wshcn/p/8157333.html

时间: 2024-08-30 10:22:17

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

APUE 学习笔记(九) 高级I/O

1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2)如果数据不能立即被(1)中文件类型接受,则写操作会使调用者永远阻塞 (3)某些进程间通信函数 非阻塞I/O使我们可以调用open.read.write这样的I/O操作,并使这些操作不会永远阻塞,如果这种操作不能完成,则调用立即出错返回 对于一个给定的文件有两种方法对其指定非阻塞I/O: (1)调用

python学习笔记九——文件与目录

1.python进行文件读写的函数是open或file类 mode:r  只读 r+   读写 w  写入,先删除原文件,再重新写入,如果文件没有则创建 w+  读写,先删除原文件,再重新写入,如果文件没有则创建(可写入和输出) a  写入,在文件末尾追加新的内容,文件不存在则创建 a+  读写,在文件末尾追加新的内容,文件不存在则创建 b  打开二进制文件,可与r,w,a,+结合使用 U  支持所有的换行符号,"\r","\n","\r\n"

angular学习笔记(九)-css类和样式3

再来看一个选择li列表的例子: 点击li中的任意项,被点击的li高亮显示: <!DOCTYPE html> <html ng-app> <head> <title>6.3css类和样式</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="scri

angular学习笔记(九)-css类和样式2

在上一个例子中,元素的类名使用拼接的方法,这样,类名中就不得不带有true或false,并且不易维护,所以,angular使用ng-class属性来控制元素的类名: 我们来看一个小例子,点击error按钮,顶部提示错误框,点击warning按钮,顶部提示警告框. 错误框的类名是.err,警告框的类名是.warn: <!DOCTYPE html> <html ng-app> <head> <title>6.2css类和样式</title> <

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

虚拟机VMWare学习笔记九 - 物理机上的文件挂载到虚拟机上

物理机上的文件夹或盘符直接挂载到虚拟机上使用. VM -- Settings Options -- Shared Folders -- 勾选Always enabled , 勾选Map as a network drive in Windows guests 在点击下面的添加来添加共享的文件夹 选择路径 可以看到虚拟机中的共享文件夹已经出现在Windows 中了 虚拟机VMWare学习笔记九 - 物理机上的文件挂载到虚拟机上

初探swift语言的学习笔记九(OC与Swift混编)

swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合使用的情况. 为了演示.先准备两个类 第一个是swift语言写的类,文件名为 act.swift import Foundation class Act : NSObject { func hasAct(tag:Int) -> String { swit

《Hibernate学习笔记九》:多对一和一对多的关联关系

<Hibernate学习笔记九>:多对一和一对多的关联关系 前面介绍了一对一的关联关系在Hibernate应该如何来实现,这篇博文就来介绍下多对一和一对多的关联关系. 多对一和一对多的关联关系在我们的生活中也比较常见,例如,在我们学生时代,一个班级可以有多个学生,而一个学生只能属于一个班级,这就是一个多对一(一对多)的例子: 还有在我们的工作中,一个工作小组可以有多个用户,而一个用户只能属于一个小组,这也是一个多对一(一对多)的关系的例子. 1.多对一的单向关联关系 下面就以一个工作小组可以有

elasticsearch学习笔记——相关插件

logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格格不入啊.国内的开源社区做了也很长时间,可是也没出现什么拿的出手的东西,可能只还有阿里比较注重分享一些. ES的查询速度非常快,搜索非常快.但是呢,我们的数据还是主要存在传统的关系型数据库中的.有没有什么办法可以将数据库中的数据实时同步到ES中呢.logstash就是这么一个东西. Logstash