elasticsearch 基础 —— Update By Query API
Update By Query API
最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新。这对于获取新属性或其他一些在线映射更改很有用 。这是API:
POST twitter/_update_by_query?conflicts=proceed
这将返回如下内容:
{
"took" : 147,
"timed_out": false,
"updated": 120,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"total": 120,
"failures" : [ ]
}
_update_by_query在索引启动时获取索引的快照,并使用internal版本控制索引它。这意味着如果文档在拍摄快照的时间和处理索引请求之间发生更改,则会出现版本冲突。当版本匹配时,文档会更新,版本号会递增。
由于
internal版本控制不支持将值0作为有效版本号,因此无法使用版本等于零的文档进行更新,_update_by_query并且将使请求失败。
所有更新和查询失败都会导致_update_by_query中止并failures在响应中返回。已执行的更新仍然存在。换句话说,该过程不会回滚,只会中止。当第一个失败导致中止时,失败的批量请求返回的所有失败都将在failures元素中返回; 因此,可能存在相当多的失败实体。
如果您只想计算版本冲突,不要导致_update_by_query 中止,您可以conflicts=proceed在URL或"conflicts": "proceed" 请求正文中设置。第一个例子是这样做的,因为它只是试图获取在线映射更改,而版本冲突只是意味着冲突文档在_update_by_query 尝试更新文档的开始和更新之间进行了更新。这很好,因为该更新将获得在线映射更新。
回到API格式,这将更新twitter索引中的推文:
POST twitter/_doc/_update_by_query?conflicts=proceed
您还可以_update_by_query使用 Query DSL进行限制。这将更新twitter用户索引中的所有文档kimchy:
POST twitter/_update_by_query?conflicts=proceed
{
"query": { ①
"term": {
"user": "kimchy"
}
}
}
必须
query以与Search API相同的方式将查询作为值传递给键。您也可以使用q与搜索API相同的方式使用参数。
到目前为止,我们只是在不更改文档来源的情况下更新文档。这对于拾取新房产等事情非常有用, 但这只是其中一半的乐趣。_update_by_query 支持脚本来更新文档。这将增加likes所有kimchy的推文上的字段:
POST twitter/_update_by_query
{
"script": {
"source": "ctx._source.likes++",
"lang": "painless"
},
"query": {
"term": {
"user": "kimchy"
}
}
}
就像在Update API中一样,您可以设置ctx.op更改执行的操作:
noop
设置ctx.op = "noop"脚本是否确定不需要进行任何更改。这将导致_update_by_query从其更新中省略该文档。这种无操作将noop在响应机构的计数器中 报告。
delete
设置ctx.op = "delete"如果你的脚本决定,该文件必须被删除。删除将deleted在响应正文中的计数器中 报告。
设置ctx.op为其他任何内容都是错误的。设置任何其他字段ctx是错误的。
请注意,我们已停止指定conflicts=proceed。在这种情况下,我们希望版本冲突中止该过程,以便我们可以处理失败。
此API不允许您移动它接触的文档,只需修改它们的源。这是故意的!我们没有规定将文档从原始位置删除。
也可以同时在多个索引和多个类型上完成这一切,就像搜索API一样:
POST twitter,blog/_doc,post/_update_by_query
如果您提供,routing则路由将复制到滚动查询,将进程限制为与该路由值匹配的分片:
POST twitter/_update_by_query?routing=1
默认情况下,_update_by_query使用1000的滚动批次。您可以使用scroll_sizeURL参数更改批量大小:
POST twitter/_update_by_query?scroll_size=100
_update_by_query也可以通过指定如下内容来使用“ 摄取节点”功能pipeline:
PUT _ingest/pipeline/set-foo
{
"description" : "sets foo",
"processors" : [ {
"set" : {
"field": "foo",
"value": "bar"
}
} ]
}
POST twitter/_update_by_query?pipeline=set-foo
URL参数
除了标准的参数,如pretty,此更新通过查询API也支持refresh,wait_for_completion,wait_for_active_shards,timeout 和scroll。
发送refresh将在请求完成时更新正在更新的索引中的所有分片。这与Index API的refresh 参数不同,后者仅导致接收新数据的分片被编入索引。
如果请求包含,wait_for_completion=false则Elasticsearch将执行一些预检检查,启动请求,然后返回task 可与Tasks API 一起使用以取消或获取任务状态的请求。Elasticsearch还将创建此任务的记录作为文档.tasks/task/${taskId}。这是你的保留或删除你认为合适。完成后,删除它,以便Elasticsearch可以回收它使用的空间。
wait_for_active_shards控制在继续请求之前必须激活碎片的副本数量。详情请见此处 。timeout控制每个写入请求等待不可用分片变为可用的时间。两者都完全适用于 Bulk API中的工作方式。由于_update_by_query采用滚动搜索,你还可以指定scroll参数来控制多长时间保持“搜索上下文”活着,例如?scroll=10m,默认情况下它是5分钟。
requests_per_second可以被设置为任何正十进制数(1.4,6, 1000等)和节流速率_update_by_query通过填充每个批次由一等待时间发出索引操作的批次。可以通过设置requests_per_second为禁用限制-1。
通过在批处理之间等待来完成限制,以便在_update_by_query内部使用的滚动 可以被赋予考虑填充的超时。填充时间是批量大小除以requests_per_second写入所花费的时间之间的差异。默认情况下,批处理大小为1000,因此如果requests_per_second设置为500:
target_time = 1000 / 500 per second = 2 seconds
wait_time = target_time - delete_time = 2 seconds - .5 seconds = 1.5 seconds
由于批处理是作为单个_bulk请求发出的,因此大批量大小将导致Elasticsearch创建许多请求,然后等待一段时间再开始下一组。这是“突发”而不是“平滑”。默认是-1。
响应正文
JSON响应如下所示:
{
"took" : 147,
"timed_out": false,
"total": 5,
"updated": 5,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures" : [ ]
}
took
整个操作从开始到结束的毫秒数。
timed_out
true如果在查询执行更新期间执行的任何请求超时 ,则将此标志设置为。
total
已成功处理的文档数。
updated
已成功更新的文档数。
deleted
已成功删除的文档数。
batches
由查询更新拉回的滚动响应数。
version_conflicts
按查询更新的版本冲突数。
noops
由于用于按查询更新的脚本返回的noop值,因此忽略的文档数ctx.op。
retries
逐个更新尝试的重试次数。bulk是重试的批量操作search的数量,是重试的搜索操作的数量。
throttled_millis
请求睡眠符合的毫秒数requests_per_second。
requests_per_second
在查询更新期间有效执行的每秒请求数。
throttled_until_millis
在按查询响应删除时,此字段应始终等于零。它只在使用Task API时有意义,它指示下一次(自纪元以来的毫秒数),为了符合,将再次执行受限制的请求requests_per_second。
failures
如果在此过程中存在任何不可恢复的错误,则会出现故障数组。如果这是非空的,那么请求因为那些失败而中止。逐个查询是使用批处理实现的,任何故障都会导致整个进程中止,但当前批处理中的所有故障都会被收集到数组中。您可以使用该conflicts选项来防止reindex在版本冲突中中止。
使用Task API
您可以使用Task API获取所有正在运行的逐个查询请求的状态 :
GET _tasks?detailed=true&actions=*byquery
回复如下:
{
"nodes" : {
"r1A2WoRbTwKZ516z6NEs5A" : {
"name" : "r1A2WoR",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1:9300",
"attributes" : {
"testattr" : "test",
"portsfile" : "true"
},
"tasks" : {
"r1A2WoRbTwKZ516z6NEs5A:36619" : {
"node" : "r1A2WoRbTwKZ516z6NEs5A",
"id" : 36619,
"type" : "transport",
"action" : "indices:data/write/update/byquery",
"status" : { ①
"total" : 6154,
"updated" : 3500,
"created" : 0,
"deleted" : 0,
"batches" : 4,
"version_conflicts" : 0,
"noops" : 0,
"retries": {
"bulk": 0,
"search": 0
}
"throttled_millis": 0
},
"description" : ""
}
}
}
}
}
该对象包含实际状态。它就像响应json一样,重要的是增加了这个
total领域。total是reindex期望执行的操作总数。您可以通过添加估计的进展updated,created以及deleted多个领域。请求将在其总和等于total字段时结束。
使用任务ID,您可以直接查找任务:
GET /_tasks/task_id
此API的优势在于它可以集成wait_for_completion=false 以透明地返回已完成任务的状态。如果任务完成并wait_for_completion=false设置在它上面,它将返回一个 results或一个error字段。此功能的成本是wait_for_completion=false创建的文档 .tasks/task/${taskId}。您可以删除该文档。
使用Cancel Task API
可以使用任务取消API取消任何按查询更新:
POST _tasks/task_id/_cancel
在task_id可以使用上述任务的API被发现。
取消应该很快发生,但可能需要几秒钟。上面的任务状态API将继续列出任务,直到它被唤醒以取消自身。
Rethrottling
requests_per_second可以使用_rethrottleAPI 通过查询在运行的更新上更改值:
POST _update_by_query/task_id/_rethrottle?requests_per_second=-1
在task_id可以使用上述任务的API被发现。
就像在_update_by_queryAPI 上设置它一样,requests_per_second 可以-1禁用限制或任何十进制数,如1.7或12限制到该级别。加速查询的Rethrottling会立即生效,但是在完成当前批处理后,重新启动会降低查询速度。这可以防止滚动超时。
切片
逐个查询支持切片滚动以并行化更新过程。这种并行化可以提高效率,并提供一种方便的方法将请求分解为更小的部分。
手动切片
通过为每个请求提供切片ID和切片总数,手动切片查询:
POST twitter/_update_by_query
{
"slice": {
"id": 0,
"max": 2
},
"script": {
"source": "ctx._source['extra'] = 'test'"
}
}
POST twitter/_update_by_query
{
"slice": {
"id": 1,
"max": 2
},
"script": {
"source": "ctx._source['extra'] = 'test'"
}
}
您可以验证哪个适用于:
GET _refresh
POST twitter/_search?size=0&q=extra:test&filter_path=hits.total
这样的结果是明智的total:
{
"hits": {
"total": 120
}
}
自动切片
您还可以使用“ 切片滚动”切换为自动并行查询 _uid。使用slices指定片使用的数字:
POST twitter/_update_by_query?refresh&slices=5
{
"script": {
"source": "ctx._source['extra'] = 'test'"
}
}
您还可以验证以下内容:
POST twitter/_search?size=0&q=extra:test&filter_path=hits.total
这样的结果是明智的total:
{
"hits": {
"total": 120
}
}
设置slices为auto将让Elasticsearch选择要使用的切片数。此设置将使用每个分片一个切片,达到一定限制。如果有多个源索引,它将根据具有最小分片数的索引选择切片数。
添加slices到_update_by_query刚刚自动化在上面的部分中使用的手工工艺,创建子请求,这意味着它有一些怪癖:
- 您可以在Tasks API中查看这些请求 。这些子请求是请求任务的“子”任务
slices。 - 获取请求的任务状态
slices仅包含已完成切片的状态。 - 这些子请求可单独寻址,例如取消和重新限制。
- 对请求进行重新处理
slices将按比例重新调整未完成的子请求。 - 取消请求
slices将取消每个子请求。 - 由于
slices每个子请求的性质将无法获得完全均匀的文档部分。将解决所有文档,但某些切片可能比其他文件更大。期望更大的切片具有更均匀的分布。 - 像请求
requests_per_second和size请求的参数slices按比例分配给每个子请求。结合上面关于分布不均匀的点,你应该得出结论,使用sizewithslices可能不会导致size文件确切地为`_update_by_query`。 - 每个子请求获得的源索引的略有不同的快照,尽管这些都是在大约相同的时间进行的。
挑选切片数量
如果自动切片,设置slices为auto将为大多数索引选择合理的数字。如果您手动切片或以其他方式调整自动切片,请使用这些指南。
当数量slices等于索引中的分片数时,查询性能最有效。如果该数字很大(例如,500),请选择较小的数字,因为太多slices会损害性能。设置 slices高于分片数通常不会提高效率并增加开销。
更新性能在可用资源上以切片数量线性扩展。
查询或更新性能是否主导运行时取决于重新编制索引的文档和群集资源。
选择一个新的属性
假设您创建了一个没有动态映射的索引,用数据填充它,然后添加了一个映射值以从数据中获取更多字段:
PUT test
{
"mappings": {
"_doc": {
"dynamic": false, ①
"properties": {
"text": {"type": "text"}
}
}
}
}
POST test/_doc?refresh
{
"text": "words words",
"flag": "bar"
}
POST test/_doc?refresh
{
"text": "words words",
"flag": "foo"
}
PUT test/_mapping/_doc ②
{
"properties": {
"text": {"type": "text"},
"flag": {"type": "text", "analyzer": "keyword"}
}
}
|
|
这意味着不会将新字段编入索引,只存储在其中 |
|
|
这会更新映射以添加新 |
搜索数据将找不到任何内容:
POST test/_search?filter_path=hits.total
{
"query": {
"match": {
"flag": "foo"
}
}
}
{
"hits" : {
"total" : 0
}
}
但您可以发出_update_by_query请求以获取新映射:
POST test/_update_by_query?refresh&conflicts=proceed
POST test/_search?filter_path=hits.total
{
"query": {
"match": {
"flag": "foo"
}
}
}
{
"hits" : {
"total" : 1
}
}
将字段添加到多字段时,您可以执行完全相同的操作。
elasticsearch 基础 —— Update By Query API的更多相关文章
- elasticsearch 基础 —— Delete By Query API
Delete By Query API _delete_by_query 的简单用法,就是在查询匹配到的每个文档上执行删除.例如: POST twitter/_delete_by_query { &q ...
- elasticsearch6.7 05. Document APIs(7)Update By Query API
6.Update By Query API _update_by_query 接口可以在不改变 source 的情况下对 index 中的每个文档进行更新.这对于获取新属性或其他联机映射更改很有用.以 ...
- elasticsearch 基础 —— Update API
Update API 更新API允许基于提供的脚本更新文档.该操作从索引获取文档(与分片并置),运行脚本(使用可选的脚本语言和参数),并对结果进行索引(也允许删除或忽略操作).它使用版本控制来确保在& ...
- elasticsearch 基础 —— Common Terms Query常用术语查询
常用术语查询 该common术语查询是一个现代的替代提高了精确度和搜索结果的召回(采取禁用词进去),在不牺牲性能的禁用词. 问题 查询中的每个术语都有成本.搜索"The brown fox& ...
- elasticsearch的javaAPI之query
elasticsearch的javaAPI之query API the Search API同意运行一个搜索查询,返回一个与查询匹配的结果(hits). 它能够在跨一个或多个index上运行, 或者一 ...
- Elasticsearch学习笔记-Delete By Query API
记录关于Elasticsearch的文档删除API的学习 首先官网上Document APIs介绍了 Delete API 和Delete By Query API. Delete API可以通过指定 ...
- 搜索引擎框架之ElasticSearch基础详解(非原创)
文章大纲 一.搜索引擎框架基础介绍二.ElasticSearch的简介三.ElasticSearch安装(Windows版本)四.ElasticSearch操作客户端工具--Kibana五.ES的常用 ...
- ElasticSearch基础学习(SpringBoot集成ES)
一.概述 什么是ElasticSearch? ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎. 它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服 ...
- Elasticsearch 基础入门
原文地址:Elasticsearch 基础入门 博客地址:http://www.extlight.com 一.什么是 ElasticSearch ElasticSearch是一个基于 Lucene 的 ...
随机推荐
- php内置函数分析之strrev()
PHP_FUNCTION(strrev) { zend_string *str; char *e, *p; zend_string *n; if (zend_parse_parameters(ZEND ...
- cmd获取管理员权限等
鼠标点点点的略过 可输入命令 runas /user:Administrator cmd 或 runas /noprofile /user:Administrator cmd Administrato ...
- CSS3 多列布局——Columns
CSS3 多列布局——Columns 语法: columns:<column-width> || <column-count> 多列布局columns属性参数主要就两个属性参数 ...
- php strripos()函数 语法
php strripos()函数 语法 作用:寻找某字符串中某字符最后出现的位置,不区分大小写.大理石平台 语法:strripos(string,find,start) 参数: 参数 描述 strin ...
- HY 的惩罚 (Trie 树,博弈论)
[问题描述] hy 抄题解又被老师抓住了,现在老师把他叫到了办公室. 老师要 hy 和他玩一个游 戏.如果 hy 输了,老师就要把他开除信息组; 游戏分为 k 轮.在游戏开始之前,老师会将 n 个由英 ...
- AGC040
AGC040 A 模拟. B 因为顺序无关紧要,所以可以先把区间按右端点排序方便处理. 设第一个区间在\(A\)集合,考虑枚举第一个在\(B\)集合的区间\(i\),这样两个集合的右端点\(\min\ ...
- 批量搞机(一):ansible简介、ansible安装
一.ansible简介 Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议.其是基于Python研发,糅合了很多老运维工具的优点实现了批量 ...
- Python_004(列表和元组)
一.列表 1. 列表: 列表的创建:li = [],列表中可以放置字符串,元组,列表,字典,列表等各种数据类型,32位的Python可以存放2^32个数据 2. 列表的索引和切片 列表的索引:格式ls ...
- (转)用Flink取代Spark Streaming!知乎实时数仓架构演进
转:https://mp.weixin.qq.com/s/e8lsGyl8oVtfg6HhXyIe4A AI 前线导读:“数据智能” (Data Intelligence) 有一个必须且基础的环节,就 ...
- video.js播放rtmp
项目中要用到rtmp直播和点播.要求:点播能够调整播放进度 开始用腾讯提供的播放器,老卡,画质差,很多时候播不出来,rtmp点播还不能快进. 后来用Wowza自带的flash rtmp播放器,有源码 ...