Update API

更新API允许基于提供的脚本更新文档。该操作从索引获取文档(与分片并置),运行脚本(使用可选的脚本语言和参数),并对结果进行索引(也允许删除或忽略操作)。它使用版本控制来确保在“get”和“reindex”期间没有发生更新。

请注意,此操作仍然意味着文档的完全重新索引,它只是删除了一些网络往返,并减少了get和索引之间版本冲突的可能性。_source需要启用该字段才能使此功能正常工作。

例如,让我们索引一个简单的文档:

  1. PUT test/_doc/1
  2. {
  3. "counter" : 1,
  4. "tags" : ["red"]
  5. }

Scripted updates 脚本更新

现在,我们可以执行一个增加计数器的脚本:

  1. POST test/_doc/1/_update
  2. {
  3. "script" : {
  4. "source": "ctx._source.counter += params.count",
  5. "lang": "painless",
  6. "params" : {
  7. "count" : 4
  8. }
  9. }
  10. }

我们可以在标签列表中添加一个标签(注意,如果标签存在,它仍会添加它,因为它是一个列表):

  1. POST test/_doc/1/_update
  2. {
  3. "script" : {
  4. "source": "ctx._source.tags.add(params.tag)",
  5. "lang": "painless",
  6. "params" : {
  7. "tag" : "blue"
  8. }
  9. }
  10. }

除了_source,下面变量可以通过ctx map来获得:_index, _type, _id, _version, _routing, _parent, 和_now(当前时间戳)

我们也可以添加一个字段到文档中:

  1. POST test/_doc/1/_update
  2. {
  3. "script" : "ctx._source.new_field = 'value_of_new_field'"
  4. }

或者从文档中移除一个字段:

  1. POST test/_doc/1/_update
  2. {
  3. "script" : "ctx._source.remove('new_field')"
  4. }

并且,我们甚至可以改变执行的操作。下面这个例子是如果tags字段包含green,就删除文档,否则就什么都不做:

  1. POST test/_doc/1/_update
  2. {
  3. "script" : {
  4. "source": "if (ctx._source.tags.contains(params.tag)) { ctx.op = 'delete' } else { ctx.op = 'none' }",
  5. "lang": "painless",
  6. "params" : {
  7. "tag" : "green"
  8. }
  9. }
  10. }

Updates with a partial document 更新部分文档

更新API还支持传递部分文档,该部分文档将合并到现有文档中(简单的递归合并,对象的内部合并,替换核心“键/值”和数组)。要完全替换现有文档,应使用indexAPI。以下部分更新会向现有文档添加新字段:

  1. POST test/_doc/1/_update
  2. {
  3. "doc" : {
  4. "name" : "new_name"
  5. }
  6. }

如果docscript都指定,那么doc会被忽视掉。最好是将部分文档的字段对放在脚本本身中。

Detecting noop updates

如果doc指定,则其值与现有值合并_source。默认情况下,不更改任何内容的更新会检测到它们没有更改任何内容并返回“result”:“noop”,如下所示:

  1. POST test/_doc/1/_update
  2. {
  3. "doc" : {
  4. "name" : "new_name"
  5. }
  6. }

如果namenew_name请求被发送之前那么整个更新请求被忽略。如果忽略请求,则result返回响应中的元素noop

  1. {
  2. "_shards": {
  3. "total": 0,
  4. "successful": 0,
  5. "failed": 0
  6. },
  7. "_index": "test",
  8. "_type": "_doc",
  9. "_id": "1",
  10. "_version": 6,
  11. "result": "noop"
  12. }

您可以通过设置“detect_noop”来禁用此行为:false,如下所示:

  1. POST test/_doc/1/_update
  2. {
  3. "doc" : {
  4. "name" : "new_name"
  5. },
  6. "detect_noop": false
  7. }

Upserts

如果文档尚不存在,则upsert元素的内容将作为新文档插入。如果文档确实存在,那么 script将执行:

  1. POST test/_doc/1/_update
  2. {
  3. "script" : {
  4. "source": "ctx._source.counter += params.count",
  5. "lang": "painless",
  6. "params" : {
  7. "count" : 4
  8. }
  9. },
  10. "upsert" : {
  11. "counter" : 1
  12. }
  13. }

scripted_upsert

如果您希望脚本运行,无论文档是否存在 - 即脚本处理初始化文档而不是 upsert元素 - 然后设置scripted_upserttrue

  1. POST sessions/session/dh3sgudg8gsrgl/_update
  2. {
  3. "scripted_upsert":true,
  4. "script" : {
  5. "id": "my_web_session_summariser",
  6. "params" : {
  7. "pageViewEvent" : {
  8. "url":"foo.com/bar",
  9. "response":404,
  10. "time":"2014-01-01 12:32"
  11. }
  12. }
  13. },
  14. "upsert" : {}
  15. }

doc_as_upsert

设置doc_as_upserttrue,如果没有文档,则doc就是新的文档:

  1. POST test/_doc/1/_update
  2. {
  3. "doc" : {
  4. "name" : "new_name"
  5. },
  6. "doc_as_upsert" : true
  7. }

参数

更新操作支持以下查询字符串参数:

参数名 描述
retry_on_conflict 在查询和插入阶段更新时,很有可能其他进程在此之前更新同一个文档。默认情况下,此处更新将会失败并且会抛出版本冲突异常。retry_on_conflict参数控制在最终抛出异常之前,重试更新多少次
routing 如果更新的文档不存在,那么就会根据routing将更新请求路由到正确的分片上并且将routing设置给upsert请求。已存在的文档不能更新路由(routing
parent 如果更新的文档不存在,那么就会根据parent将更新请求路由到正确的分片上并且将parent设置给upsert请求。已存在的文档不能更新parent。如果给索引(数据库)路由指定了别名,那么该别名会覆盖parent路由,并且会被用于路由请求。
timeout 分片变为可利用之前的等待超时时间
wait_for_active_shards 在处理更新请求操作之前,副本分片必须存活的数量。详情参考这里
refresh 控制此处请求做出的更改对于搜索而已是可见的。参考?refresh
_source 在响应中控制是否和如何控制更新返回的source字段。默认情况下,更新的source是不返回的。详情查看source filtering
version&version_type update api使用elasticsearch内部版本号,来确保在更新期间,文档没有变化。你也可以使用version参数来指定版本号,只有和指定版本号匹配的情况下才会更新。通过将version type设置为force,你可以在更新文档后,强制新版本号(使用时非常小心,使用force不能确保文档没有发生变化,通俗点就是会忽略版本冲突)。

The update API does not support external versioning

update api 是不支持外部版本号(version types external & external_gte)的,因为它会造成elasticsearch版本号和外部系统不一致。可以使用index api进行替换。

elasticsearch 基础 —— Update API的更多相关文章

  1. elasticsearch 基础 —— Update By Query API

    Update By Query API 最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新.这对于获取新属性或其他一些在线映射更改很有用 .这是API: POS ...

  2. elasticsearch 基础 —— Get API

    Get API get API允许根据其id从索引中获取指定类型的JSON文档.以下示例从名为twitter的索引获取JSON文档,该索引类型名为_doc,id值为0: GET twitter/_do ...

  3. 搜索引擎框架之ElasticSearch基础详解(非原创)

    文章大纲 一.搜索引擎框架基础介绍二.ElasticSearch的简介三.ElasticSearch安装(Windows版本)四.ElasticSearch操作客户端工具--Kibana五.ES的常用 ...

  4. ElasticSearch基础学习(SpringBoot集成ES)

    一.概述 什么是ElasticSearch? ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎. 它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服 ...

  5. elasticsearch中的API

    elasticsearch中的API es中的API按照大类分为下面几种: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作 查看A ...

  6. Update API

    Update API可以根据提供的脚本更新文档. 该操作从索引获取文档,运行脚本(脚本语言和参数是可选的),并返回操作的结果(也允许删除或忽略该操作). 使用版本控制来确保在“get”(查询文档)和“ ...

  7. elasticsearch6.7 05. Document APIs(6)UPDATE API

    5. UPDATE API 更新操作可以使用脚本来更新.更新的时候会先从索引中获取文档数据(在每个分片中的集合),然后运行脚本(使用可选的脚本语言和参数),再果进行索引(还允许删除或忽略该操作).它使 ...

  8. elasticsearch 6.0java api的使用

    elasticsearch 6.0 中java api的使用 1:使用java api创建elasticsearch客户端 package com.search.elasticsearch; impo ...

  9. Elasticsearch 基础入门

    原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...

随机推荐

  1. java类实现序列化的方法?collection框架中实现什么样的接口

  2. 线程数设置和CPU数的关系

    一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数) 如果是CPU密集型应用,则线程池大小设置为N+1 如果是IO密集型应用,则线程池大小设置为2N+1(因为io读数据或者缓存的 ...

  3. python NameError: name 'file' is not defined

    import sys import time import os poem='''\ 测试读写文件 ''' print(os.getcwd()) f=file(os.getcwd()+'/python ...

  4. R语言把DataFrame的一行变成向量

    在R语言里面,DataFrame的一列数据本质上可以认为是一个向量或列表,但是一行数据不是. 今天有一个31列的数据集,由于放在第一行的变量名格式不规范,读入数据的时候不能顺带读入变量名.于是跳过首行 ...

  5. drf 搜索功能

    from django_filters.rest_framework import DjangoFilterBackend from rest_framework import viewsets fr ...

  6. Telegraf根据配置文件启动(Influxdb的数据收集)

    1.创建一个telegraf.config文件 telegraf -sample-config -input-filter cpu:disk:diskio:net:system:mem -output ...

  7. 历时小半年总结之JAVA

    一.JavaSE 1.多线程 (1).进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. (2).为什么要用多线程? 答:提高程序效率 (3).多线 ...

  8. asp.net文件断点上传

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

  9. 批量搞机(二):分布式ELK平台、Elasticsearch介绍、Elasticsearch集群安装、ES 插件的安装与使用

    一.分布式ELK平台 ELK的介绍: ELK 是什么? Sina.饿了么.携程.华为.美团.freewheel.畅捷通 .新浪微博.大讲台.魅族.IBM...... 这些公司都在使用 ELK!ELK! ...

  10. Uva 12563 Jin Ge Jin Qu hao(01背包)

    题意: 假定你在唱KTV,还剩下t秒时间.你决定接下来唱你最喜爱的n首歌(不包含劲歌金曲)中的一些歌曲.在时间结束之前再唱一个劲歌金曲.使得唱的歌的总曲目尽量多以及时间总长度. 输入保证所有n+1曲子 ...