07.update和upsert操作

2024-08-31 15:58
文章标签 操作 update 07 upsert

本文主要是介绍07.update和upsert操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. Update API 简介
    • 2. 使用脚本更新
    • 3. 非script的部分文档更新
    • 4. 检测空操作更新 noop updates
    • 5. Upserts
      • 1. scripted_upsert
      • 2. doc_as_upsert
    • 6. 参数

1. Update API 简介

update API 允许基于script脚本来更新doc。对应的操作从index当中获取doc,然后run script, 然后再将修改后的doc indexing到原来的index。在这个过程中使用了version控制,以便于确保在获取和重新索引没有更新发生。

注意,此操作仍然意味着对文件做重新的全索引。它只是删除了一些网络往返,减少了在索引和获取时候版本冲突的几率。 _source需要启用此功能工作。

例如:一个简单的索引文件:

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

2. 使用脚本更新

现在,我们可以执行一个脚本,用做计数器:

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

我们可以添加标签来进行标记(注意,如果标签存在,仍然会添加,因为是一个列表)

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

我们可以从标签列表中删除标签。请注意,删除标签的painless的remove函数将要删除的元素的数组索引作为其参数,因此需要更多的逻辑来定位它,同时避免运行时错误。请注意,如果该标签在列表中出现多次,则只会删除一次该标签

POST test/_update/1
{"script" : {"source": "if (ctx._source.tags.contains(params.tag)) { ctx._source.tags.remove(ctx._source.tags.indexOf(params.tag)) }","lang": "painless","params" : {"tag" : "blue"}}
}

除了_source,下列变量通过 ctx map 都是可用的:_index,_type,_id,_version,_routing,_parent,和_now(当前的时间戳)。

我们也可以将新字段添加到文档:

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

或者从文件中删除字段:

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

而且,我们甚至可以改变已执行的操作。这个例子就是如果 tags包含 green删除文档,否则就什么也不做(noop):

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

3. 非script的部分文档更新

更新 API 还支持部分文档的更新,将合并到现有的文件(简单的递归合并,内合并,更换核心“键/值”对和数组)。例如:

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

如果同时 doc 和 script 被指定,那么 doc将被忽略。推荐的做法是使用script来update部分文档。

4. 检测空操作更新 noop updates

默认情况下回进行无更新检测,当要merged的doc片段和原有的doc中的字段是一致的话,不会有更新操作产生,在response当中会有一个"result": "noop"标识
比如下面的操作

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

如果 name字段在这个秦秋之前就是 new_name,那么整个更新请求会被忽略。如果请求被忽略了,在 result响应中的返回 noop。

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

你可以通过设置 “detect_noop” 禁用此行为:

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

5. Upserts

如果该文件存在,那么 script将执行。如果该文件不存在,则upsert内容将被插入作为一个新的文档。

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

上面的请求如果_id为1的doc不存在的话,会插入一个文档,source中只有一个字段,是counter:1

1. scripted_upsert

如果你想你的脚本无论该文件存在与否都要运行-即脚本处理初始化文件而不是 upsert -然后设置 scripted_upsert为 true:

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

2. doc_as_upsert

doc 添加一个 upsert文档,设置 doc_as_upsert为 true ,将使用 doc 内容作为 upsert 值:

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

6. 参数

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

retry_on_conflict 在更新的 get 和 index 时,它可能是另一种方法可能已经更新了相同的文件。默认情况下,更新将失败,版本冲突异常。该 retry_on_conflict 参数控制抛出异常之前重试更新的次数。
routing 用于追踪更新请求正确的分片,如果文档更新不存在把其设置为更新插入请求。不能用于更新现有文档的路径。
timeout 超时等待一个分片变得可用。
wait_for_active_shards 在更新操作时,复制分片需要处在活跃状态的数目。
refresh 控制被该请求所做更改时进行的搜索。
_source 允许控制是否以及更新源如何在响应中返回。默认情况下不返回更新的源。见 source_filtering 详情。
version 更新 API 使用 Elasticsearch 的internal version。您可以使用 version 参数指定版本,如果文件匹配那么指定的文件需要更新。
if_seq_no and if_primary_term: 可以用来做并发控制,可以控制仅在文档的最后一次因为修改分配的_seq_no和_primary_term 参数和请求时传进来的if_seq_no和if_primary_term参数相等的情况下才能执行操作。如果检测到不匹配,则该操作将导致VersionConflictException和状态码409。

注意:
update api只支持internal version,External (version types external and external_gte) 是不支持的。

这篇关于07.update和upsert操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124347

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编