elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API
大家好,我是烤鸭:
今天分享的是官网6.x 单一文档(Single document APIs)APIs。
本文这是部分翻译,如果想看全部的,还是建议阅读官方api。链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html
1. 删除 (delete) API
DELETE /twitter/_doc/1
结果:
{"_shards" : {"total" : 2,"failed" : 0,"successful" : 2},"_index" : "twitter","_type" : "_doc","_id" : "1","_version" : 2,"_primary_term": 1,"_seq_no": 5,"result": "deleted"
}
版本控制
索引的每个文档都是版本控制的。删除文档时,可以指定version
,以确保我们试图删除的相关文档实际上已经被删除了,并且同时没有被更改。在文档上执行的每一个写入操作(包括删除操作)都会导致其版本增加。删除文档的版本号在删除后的短时间内仍然可用,以允许对并发操作的控制。删除文档的版本可用的时间由index.gc_deletes参数决定和默认为60秒。
当使用索引控制路由时,删除文档还应提供路由值。例如:
DELETE /twitter/_doc/1?routing=kimchy
以上将删除带有索引为tweet ,id为1的文档,但将基于用户路由。注意,没有正确路由的删除将不会删除成功。
当_routing
映射设置为required
,并且没有指定路由值时,删除API将引发一个路由RoutingMissingException
并拒绝该请求。
自动索引创建
如果使用 external versioning variant,如果索引尚未创建,则删除操作将自动创建一个索引(请检查create indexAPI以手动创建索引),并且如果尚未创建特定类型之前(检查put mappingAPI以手动创建类型映射),则自动创建动态类型映射。
分布式
等待active碎片
在执行删除请求时,可以在开始处理删除请求之前设置wait_for_active_shards
参数,以要求最小数量的碎片副本是active的。请参阅这里的详细信息和使用示例。
超时
当主碎片被要求执行删除操作,当操作被执行后,主碎片可能不可用。一些原因可能是,主要碎片目前正在从内存恢复或进行重新定位。默认情况下,删除操作在主碎片在故障和响应错误之前,将等待1分钟。timeout
参数可用于显式指定它等待多长时间。下面是将其设置为5分钟的示例:
DELETE /twitter/_doc/1?timeout=5m
2. 更新 (update) API
更新API允许根据提供的脚本更新文档。从索引获取(与碎片搭配的)文档,运行脚本(带有可选的脚本语言和参数),并返回结果(也允许删除或忽略操作)。它使用版本控制来确保在“获取”和“重新索引”期间没有发生任何更新。
注意,此操作仍然意味着文档的完全重新索引,它只删除一些网络往返行程,降低了获取操作和索引操作之间的版本冲突的可能性。必须启用_source字段来启用此功能。
简单例子:
PUT test/_doc/1
{"counter" : 1,"tags" : ["red"]
}
脚本更新
运行脚本,自增计数。
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
图获得,如:_index、_type、_id、_version、_routing
和_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,删除文档,否则它不做任何操作(noop):
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"}}
}
更新部分文档
更新API还支持传递部分文档,该文档将被合并到现有文档中(简单递归合并、对象内部合并、替换核心“键值对”和数组)。要完全替换现有文档,应该使用index API。下面的部分更新是对现有文档添加了新字段:
POST test/_doc/1/_update
{"doc" : {"name" : "new_name"}
}
如果指定了doc
和script
,则忽略doc
。最好是将你的字段对的部分文档放在脚本本身中。
NOOP更新检查
如果doc
被指定,它的值将与现有的_source合并。默认情况下,更新检测会检测到它们不会改变任何东西,并返回“"result": "noop" ,像这样:
POST test/_doc/1/_update
{"doc" : {"name" : "new_name"}
}
如果在发送请求之前name
如果是new_name
,则忽略整个更新请求。如果请求被忽略,响应中的result
返回noop
。
{"_shards": {"total": 0,"successful": 0,"failed": 0},"_index": "test","_type": "_doc","_id": "1","_version": 6,"result": "noop"
}
可以禁用上面的更新检查:
POST test/_doc/1/_update
{"doc" : {"name" : "new_name"},"detect_noop": false
}
更新插入
如果文档不存在,则upsert
元素的内容将作为新文档插入。如果文档确实存在,那么script
将被执行:
POST test/_doc/1/_update
{"script" : {"source": "ctx._source.counter += params.count","lang": "painless","params" : {"count" : 4}},"upsert" : {"counter" : 1}
}
更新插入脚本
如果不管文档是否存在,脚本都运行的话,即脚本代替upsert
初始化文档,将scripted_upsert设置为true:
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
加上upsert
doc
,将doc_as_upsert
设置为true
将使用doc
的内容作为upsert
值:
POST test/_doc/1/_update
{"doc" : {"name" : "new_name"},"doc_as_upsert" : true
}
参数
更新操作支持下列query-string 参数:
retry_on_conflict
在更新的获取和索引阶段之间,可能另一个进程可能已经更新了同一文档。默认情况下,更新操作将因版本冲突异常而失败。retry_on_conflict
参数控制在最终抛出异常之前重试更新的次数。
routing
路由用于将指引更新请求路由到正确的碎片,如果更新的文档不存在,则为更新插入请求设置路由。不能用于更新已存在文档的路由。
timeout
碎片的超时等待变成可用。
wait_for_active_shards
在进行更新操作之前需要active的碎片副本的数量。详情请见这里。
refresh
控制此请求所做的更改为可见的并且能够搜索到。详情见这里。
_source
控制被更新的source是否可以以及如何在响应中返回。默认情况下,更新的source不返回。有关详细信息,请参见source filtering 。
version
Update API在内部使用依靠es的版本控制支持,以确保文档在更新过程中不会改变。可以使用version
参数指定文档仅在其版本与指定的版本匹配时才被更新。
更新API不支持除内部版本之外的版本控制。
更新API不支持外部(版本类型external
和external_gte)或强制(版本类型force)版本,因为这会导致es版本号与外部系统不同步。外部请使用使用index API 。
更多关于elasticsearch 6.x内容:
1. elasticsearch 6.x 部署 windows入门(一) spingboot连接
2. elasticsearch 6.x linux部署(二) kibana x-pack 安装
3. elasticsearch 6.x (三) linux 集群多节点部署
4. elasticsearch 6.x (四) 单一文档 API 介绍和使用 index和get API
elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API相关推荐
- elasticsearch 6.x (四) 单一文档 API 介绍和使用 index和get API
大家好,我是烤鸭: 今天分享的是官网6.x 单一文档(Single document APIs)APIs. 本文这是部分翻译,如果想看全部的,还是建议阅读官方api.链接: https://ww ...
- elasticsearch基础1——索引、文档
用于复习快速回顾. 目录 1.初识弹性搜索elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK弹性栈 1.1.3.elasticsearch和 ...
- ElasticSearch查询篇索引映射文档数据准备
elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...
- 苹果电脑上好用的五款文档文字编辑处理工具
苹果电脑上文字编辑必不可少,那么哪个更好用呢,今天就为大家分享几款苹果电脑上好用的五款文档文字编辑处理工具,以做参考. 第一款:word 2019中文 文档处理软件中 ,我们常用的也就两个:一是off ...
- 接口对接文档规范2023年最新版(Restful API风格)
接口对接文档 服务共享 1.设计模式 使用Restful API风格, Restful API的优势是具备更好的易用性,让异构系统更容易集成,且开发执行效率比较高,面向资源要求也比较高. 2.设计约束 ...
- Elasticsearch基本操作:索引、文档、搜索
1.索引 在 Elasticsearch 中开始为数据建立索引之前要做的第一步操作是创建--我们的数据主要容器.这里的索引类似于 SQL 中的数据库概念.它是类型(相当于 SQL 中的表)和文档(相当 ...
- Logstash+Elasticsearch+kibana搭建日志平台文档(xjh20160527重庆公司亲测可用)
Logstash+Elasticsearch+kibana搭建日志平台文档 v1.0_xjh 20160527 http://wenku.baidu.com/link?url=_HaXh4neqWm ...
- Tsung MQTT协议简介及MQTT xml文档配置介绍
MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...
- 产品设计(1) – 产品需求文档(PRD)介绍
产品设计是一个由抽象的概念到具体形象化的处理过程,通过文字或图像等方式将我们规划的产品需求展现出来.它将产品的某种目的或需求转换为一个具体的物理或工具的过程,把一种计划.规划设想.问题解决的方法,通过 ...
最新文章
- iOS 9 通用链接(Universal Links)
- Android 线程 thread 两种实现方法!
- Swift之深入解析“属性”的底层原理
- 单IP无TMG拓扑Lync Server 2013:前端服务器
- React之类式组件
- java树洞_SSM框架开发案例——铁大树洞后台管理系统
- mysql数据库执行事务日志_第十章 MySQL事务及其日志介绍
- 第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV 标签: SFM3D重建 2015-01-15
- 无法启动程序因为计算机中丢失msvcr100,devenv.exe 系统错误无法启动此程序,因为计算机中丢失 MSVCR100.dll问题的解决办法...
- linux iq测试题,ayawawa测试题
- book--Unix Linux大学教程
- TypeError: FC() takes no arguments
- eclipse写入mysql乱码问题_怎么办eclipse向mysql插入数据出现乱码
- 我们计划为EasyDSS定制开发一款超低延时的EasyPlayer Flash播放器
- java基础知识精华总结集合
- 解决TIM版无法修改个人文件夹位置
- linux su无效_Linux下su命令无反应的解决办法
- 揭阳学计算机的好学校,揭阳中学排名前十名,2021年揭阳中学排名一览表
- 双模sa_NSA/SA双模5G基站才是通信运营商决胜未来的关键!
- 【数据结构与算法】普里姆算法的介绍和修路问题程序实现
热门文章
- [html] 页面的重绘和回流是什么?
- [html] 如何优化页面的渲染过程?
- 工作398-关于e.currentTarget.dataset的取值。
- [vue] 如果让你教一个2-3年经验前端经验的同事使用vue,你该怎么教?
- [css] 用css实现饼图效果
- 工作271:打开弹出框调用当前页面接口
- 工作69:发布商品页面
- 前端学习(2116):为什么组件data必须是函数
- 前端学习(1669):前端系列实战课程之半透明拖拽思路
- 前端学习(1288):nodejs模块化开发