Update API

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

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

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

PUT test/_doc/1
{
"counter" : 1,
"tags" : ["red"]
}

Scripted updates 脚本更新

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

POST test/_doc/1/_update
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
}
}

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

POST test/_doc/1/_update
{
"script" : {
"source": "ctx._source.tags.add(params.tag)",
"lang": "painless",
"params" : {
"tag" : "blue"
}
}
}

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

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

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

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

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

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

POST test/_doc/1/_update
{
"script" : {
"source": "if (ctx._source.tags.contains(params.tag)) { ctx.op = 'delete' } else { ctx.op = 'none' }",
"lang": "painless",
"params" : {
"tag" : "green"
}
}
}

Updates with a partial document 更新部分文档

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

POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
}
}

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

Detecting noop updates

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

POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
}
}

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

{
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_index": "test",
"_type": "_doc",
"_id": "1",
"_version": 6,
"result": "noop"
}

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

POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
},
"detect_noop": false
}

Upserts

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

POST test/_doc/1/_update
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
},
"upsert" : {
"counter" : 1
}
}

scripted_upsert

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

POST sessions/session/dh3sgudg8gsrgl/_update
{
"scripted_upsert":true,
"script" : {
"id": "my_web_session_summariser",
"params" : {
"pageViewEvent" : {
"url":"foo.com/bar",
"response":404,
"time":"2014-01-01 12:32"
}
}
},
"upsert" : {}
}

doc_as_upsert

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

POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
},
"doc_as_upsert" : true
}

参数

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

参数名 描述
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. shell 数组中 @ 跟 * 的区别

    关于在shell脚本中数组变量中 “*”跟 “@” 区别 “*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的. #!/bin/ ...

  2. python的次方操作

    好简单,不需要import任何包 b=a**n就是求a的n次方,如果n=0.5就是开方 如果开方的是负数或者附复数,需要 import math b=math.sqrt(a) 这样

  3. redis学习 --Hash

    一:我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等.如果H ...

  4. 【转】django 正则URL 匹配

    django 正则URL 匹配  转自:https://www.cnblogs.com/chenkeven/articles/9305260.html 一.引子 在day17 作业中,我们查看主机详细 ...

  5. (转)Python3 zip() 函数

    转:http://www.runoob.com/python3/python3-func-zip.html 描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返 ...

  6. CodeChef FNCS (分块+树状数组)

    题目:https://www.codechef.com/problems/FNCS 题解: 我们知道要求区间和的时候,我们用前缀和去优化.这里也是一样,我们要求第 l 个函数到第 r 个函数 [l, ...

  7. ngrinder压力测试

    文章目录 另一篇 部署demo 写脚本 压力测试 目标主机监控 可能报错 总结: 另一篇 https://blog.csdn.net/dataiyangu/article/details/888518 ...

  8. js-jssdk微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)

    值得注意的是: 1.在微信H5中选择图片运用:wx.chooseImage,成功后返回:  res.localIds用于上传图片使用    上传图片:wx.uploadImage. 2.上传图片的时候 ...

  9. HDU 2063 过山车 (匈牙利算法)

    题目链接:HDU 2063 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩 ...

  10. Using Tensorflow SavedModel Format to Save and Do Predictions

    We are now trying to deploy our Deep Learning model onto Google Cloud. It is required to use Google ...