当前位置: 首页 > article >正文

【Elasticsearch从入门到精通】第15篇:Elasticsearch删除与更新API——精确操作与脚本更新

上一篇【第14篇】Elasticsearch文档检索API——GET、MGet与字段选择下一篇【第16篇】Elasticsearch批量操作API——Bulk、Reindex与跨集群索引摘要数据的删除和更新是Elasticsearch文档操作中不可或缺的环节。本文全面讲解了Elasticsearch删除与更新API的使用方法涵盖Delete API的单文档精确删除及响应码解析、Update API的三种核心用法——基于Painless脚本的灵活更新ctx._source操作、部分文档字段合并更新、upsert插入或更新的条件操作以及doc_as_upsert简写模式。同时深入介绍了Delete by Query查询删除和Update by Query查询更新的批量操作包括切片slices并行处理策略、Task API追踪长时间操作进度、取消任务和动态调整速率等高级特性。掌握这些内容将使你能够灵活应对各种数据变更场景。一、Delete API单文档删除1.1 基本用法Delete APIDELETE允许根据文档ID从索引中删除JSON文档DELETEtwitter/_doc/1如果文档存在且被成功删除响应如下{_index:twitter,_type:_doc,_id:1,_version:2,result:deleted,_shards:{total:2,successful:1,failed:0},_seq_no:1,_primary_term:1}1.2 响应码说明状态码含义说明200文档已找到并删除result为deleted404文档不存在result为not_found409版本冲突并发操作时版本不匹配注意即使文档不存在Delete API也会返回_version递增。在Elasticsearch内部旧文档只是被标记为已删除并不会立即从磁盘中移除后台的段合并过程会在适当时机清除这些标记数据。1.3 带版本控制的删除可以使用乐观并发控制来确保删除的是正确版本的文档DELETEtwitter/_doc/1?if_seq_no1if_primary_term1如果序列号不匹配操作将返回版本冲突错误。二、Update API基本用法2.1 工作原理Update API_update允许根据提供的脚本或部分文档来更新已有文档。其内部流程为从索引中获取文档Get操作运行脚本或合并部分文档Modify操作将结果重新索引Reindex操作因此Update API本质上是一次读取-修改-写入的操作。它使用版本控制来确保在Get和Reindex期间没有发生其他更新。注意此操作仍然意味着文档的完全重新索引只是减少了一些网络往返并降低了Get和Reindex操作之间版本冲突的可能性。需要启用_source才能使用此功能。三、使用Painless脚本更新3.1 Painless脚本基础Painless是Elasticsearch默认的脚本语言专门为Elasticsearch设计具有高性能和安全性。在Update API中使用脚本可以实现灵活的更新逻辑。3.2 增加计数器以下脚本将counter字段的值增加指定数量POSTtwitter/_update/1{script:{source:ctx._source.counter params.count,lang:painless,params:{count:4}}}3.3 向列表添加元素向tags列表字段中添加标签如果标签已存在仍会被添加因为这是列表操作POSTtwitter/_update/1{script:{source:ctx._source.tags.add(params.tag),lang:painless,params:{tag:blue}}}3.4 从列表删除元素从标签列表中删除指定标签。需要先定位元素的位置再删除POSTtwitter/_update/1{script:{source:ctx._source.tags.remove(ctx._source.tags.indexOf(params.tag)),lang:painless,params:{tag:blue}}}3.5 添加和删除字段添加新字段POSTtwitter/_update/1{script:{source:ctx._source.new_field params.value,lang:painless,params:{value:hello}}}删除字段POSTtwitter/_update/1{script:{source:ctx._source.remove(new_field),lang:painless}}3.6 条件操作根据条件执行不同的操作。以下示例中如果tags字段包含green则删除文档否则不执行任何操作noopPOSTtwitter/_update/1{script:{source:if (ctx._source.tags.contains(green)) { ctx.op delete; } else { ctx.op noop; },lang:painless}}3.7 脚本中可用的上下文变量除了ctx._source外还可以通过ctx映射访问以下变量变量说明_index文档所属索引_type文档类型_id文档ID_version文档版本号_routing路由值_now当前时间戳_op操作类型update/noop/delete四、部分字段更新doc4.1 基本用法Update API支持传递部分文档进行更新在内部完成合并操作简单的递归合并POSTtwitter/_update/1{doc:{name:new_name,age:20}}上述请求会将name和age字段与现有的_source合并其他字段保持不变。4.2 detect_noop避免无效更新默认情况下如果doc中的字段值与原文档完全相同Elasticsearch会跳过更新响应返回result: noopPOSTtwitter/_update/1{doc:{name:new_name}}如果name的值未变响应为{_id:1,result:noop}可以通过设置detect_noop: false来禁用此行为强制执行更新POSTtwitter/_update/1{doc:{name:new_name},detect_noop:false}注意如果同时指定了doc和script则doc会被忽略。建议将部分文档字段放在脚本本身中。五、upsert与doc_as_upsert5.1 upsert操作upsert元素用于处理文档不存在则插入存在则更新的场景POSTtwitter/_update/2{script:{source:ctx._source.counter params.count,lang:painless,params:{count:1}},upsert:{counter:1}}首次执行文档不存在执行创建操作result: created。再次执行文档已存在执行脚本更新result: updated。5.2 scripted_upsert参数如果不管文档是否存在都希望运行脚本可以设置scripted_upsert: truePOSTtwitter/_update/2{scripted_upsert:true,script:{source:if (ctx._source.counter null) { ctx._source.counter 1; } else { ctx._source.counter 1; },lang:painless},upsert:{}}5.3 doc_as_upsert参数doc_as_upsert是一种简写模式当文档不存在时使用doc的内容作为新文档插入POSTtwitter/_update/2{doc:{name:kimchy,counter:1},doc_as_upsert:true}5.4 Update API三种模式对比模式参数文档存在时文档不存在时适用场景脚本更新script执行脚本报错复杂逻辑更新部分更新doc合并字段报错简单字段更新条件插入upsert执行脚本插入upsert内容计数器、状态管理脚本插入scripted_upsert执行脚本执行脚本脚本统一处理初始化文档插入doc_as_upsert合并字段插入doc内容简单的插入或更新六、Delete by Query查询删除6.1 基本用法Delete by Query_delete_by_query对每个与查询匹配的文档执行删除操作POSTtwitter/_delete_by_query{query:{match:{message:some message}}}响应如下{took:438,timed_out:false,total:119,deleted:119,batches:1,version_conflicts:0,noops:0,retries:{bulk:0,search:0},throttled_millis:0,requests_per_second:-1,throttled_until_millis:0,failures:[]}6.2 版本冲突处理_delete_by_query在启动时获取索引快照使用内部版本控制删除匹配内容。如果文档在快照和删除请求之间被修改会出现版本冲突。通过设置conflictsproceed可以让操作在版本冲突时继续执行POSTtwitter/_delete_by_query?conflictsproceed{query:{match_all:{}}}6.3 多索引操作可以同时对多个索引执行查询删除POSTtwitter,blog/_delete_by_query{query:{match_all:{}}}6.4 关键参数说明参数说明默认值refresh完成后刷新所有涉及分片不刷新scroll_size滚动批次大小1000requests_per_second限速-1为不限速-1wait_for_completion是否等待完成false返回Tasktruetimeout每个写请求的超时时间1mscroll搜索上下文保持时间5mslices切片数量并行处理16.5 切片并行处理_delete_by_query支持切片滚动使删除过程可以并行执行。自动切片POSTtwitter/_delete_by_query?conflictsproceedslicesauto{query:{match_all:{}}}auto将为每个分片使用一个切片。手动切片时建议遵循以下准则切片数等于索引分片数时性能最佳删除性能随切片数和可用资源线性扩展切片数不要大于分片数量否则会增加额外开销七、Update by Query查询更新7.1 基本用法Update by Query_update_by_query对索引中的每个文档执行更新操作POSTtwitter/_update_by_query?conflictsproceed上述请求会重新索引所有文档适用于获取新添加的映射字段。7.2 带查询条件的更新结合DSL查询只更新匹配特定条件的文档POSTtwitter/_update_by_query{query:{term:{user:kimchy}}}7.3 使用脚本更新可以在更新中使用脚本修改文档内容POSTtwitter/_update_by_query{query:{term:{user:kimchy}},script:{source:ctx._source.likes,lang:painless}}7.4 脚本中的ctx.op控制在_update_by_query的脚本中可以设置ctx.op来控制对文档的操作ctx.op值行为update默认更新文档noop跳过该文档delete删除该文档7.5 获取新映射属性_update_by_query的一个重要应用场景是获取新添加的映射属性。例如PUTtwitter/_mapping{properties:{flag:{type:keyword}}}POSTtwitter/_update_by_query这样所有文档都会被重新索引新添加的flag字段会被提取出来。八、Task API追踪操作进度8.1 获取任务状态对于长时间运行的查询删除或查询更新操作可以使用Task API追踪进度GET_tasks?detailedtrueactions*/delete/byquery或者使用任务ID直接查询GET_tasks/r1A2WoRbTwKZ516z6NEs5A:36619响应中的status字段包含任务的实际进度信息{completed:false,task:{node:r1A2WoRbTwKZ516z6NEs5A,id:36619,type:transport,action:indices:data/write/delete/byquery,status:{total:119,deleted:60,batches:1,version_conflicts:0,noops:0,retries:{bulk:0,search:0}}}}8.2 异步执行设置wait_for_completionfalse让操作在后台执行立即返回任务IDPOSTtwitter/_delete_by_query?wait_for_completionfalse{query:{match_all:{}}}8.3 取消任务使用取消任务API终止正在运行的删除/更新操作POST_tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel8.4 动态调整速率在运行时使用_rethrottleAPI动态调整操作速率POST_delete_by_query/r1A2WoRbTwKZ516z6NEs5A:36619/_rethrottle?requests_per_second-1九、总结与最佳实践9.1 核心要点回顾Delete API提供精确的单文档删除能力支持乐观并发控制Update API支持三种模式脚本更新灵活复杂、doc部分更新简单直接、upsert条件插入Painless脚本是更新的核心工具通过ctx._source操作文档字段Delete/Update by Query实现批量删除和更新支持切片并行处理Task API提供长时间操作的进度追踪、取消和速率调整能力detect_noop和conflictsproceed是优化更新性能的重要手段9.2 生产环境最佳实践优先使用doc部分更新简单的字段修改优先使用doc而非脚本性能更好合理使用upsert计数器、状态管理等场景使用upsert避免先查后写的竞态条件批量操作切片化大数据量的_delete_by_query和_update_by_query务必使用切片并行速率控制在业务低峰期执行大批量删除/更新并使用requests_per_second限制对集群的影响异步执行大批量操作使用wait_for_completionfalse异步执行通过Task API监控进度上一篇【第14篇】Elasticsearch文档检索API——GET、MGet与字段选择下一篇【第16篇】Elasticsearch批量操作API——Bulk、Reindex与跨集群索引

相关文章:

【Elasticsearch从入门到精通】第15篇:Elasticsearch删除与更新API——精确操作与脚本更新

上一篇【第14篇】Elasticsearch文档检索API——GET、MGet与字段选择 下一篇【第16篇】Elasticsearch批量操作API——Bulk、Reindex与跨集群索引 摘要 数据的删除和更新是Elasticsearch文档操作中不可或缺的环节。本文全面讲解了Elasticsearch删除与更新API的使用方法&#xff…...

别再手搓流程图了!用WPF从零封装一个可拖拽、可连接的业务节点控件(附完整源码)

WPF业务流程图控件开发实战:从零构建可拖拽节点系统 在当今企业级应用开发中,可视化业务流程配置已成为提升用户体验的关键要素。无论是审批流程引擎、ETL数据处理管道,还是自动化任务编排系统,都需要直观的节点连接界面。本文将深…...

Postman登录接口响应为空?HTTP响应体未刷出的三层根因分析

1. 这不是Postman的问题,是接口通信链路上某个环节“失语”了你用Postman调后端登录接口,请求发出去了,状态码也回来了(比如200),但响应体里空空如也——没有JSON数据、没有token字段、甚至Response标签页里…...

初次使用Taotoken控制台管理账单与查看各模型消耗明细

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初次使用Taotoken控制台管理账单与查看各模型消耗明细 对于刚开始使用大模型服务的开发者或团队而言,清晰、透明地掌握…...

AI医疗落地实操指南:临床决策支持与人机协同诊疗

1. 这不是科幻片,是每天在三甲医院晨交班时发生的事 “AI把医生取代了?”——这是我过去三年被问得最多的问题,通常来自刚轮转到信息科的住院医,或是陪孩子看病时刷到短视频的家长。但真实情况比这复杂得多:上周五我蹲…...

Topit:终极免费macOS窗口置顶工具,让工作效率飙升300%

Topit:终极免费macOS窗口置顶工具,让工作效率飙升300% 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否经常在macOS上同时处理多个…...

告别PyTorch依赖:手把手教你用C++ CUDA实现LeNet推理,从Python模型导出到C++部署全流程

从PyTorch到C CUDA:工业级LeNet模型部署全流程实战 在深度学习模型开发中,Python生态提供了丰富的训练工具,但生产环境往往需要高性能的C实现。本文将完整演示如何将PyTorch训练的LeNet模型部署到C CUDA环境,涵盖模型导出、内存管…...

别再只盯着人脸了!手把手教你用Python复现2023年最新的多模态情绪识别模型COGMEN

别再只盯着人脸了!手把手教你用Python复现2023年最新的多模态情绪识别模型COGMEN 情绪识别技术正在经历从单一模态到多模态融合的范式转变。传统基于面部表情的分析方法往往受限于光照条件、遮挡问题以及文化差异带来的表达偏差。2023年发布的COGMEN模型通过引入图…...

如何通过 TaoToken CLI 快速安装配置多模型调用环境

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何通过 TaoToken CLI 快速安装配置多模型调用环境 对于希望快速接入多个大模型的开发者而言,逐一配置不同工具的 API…...

别让‘单电源供电’坑了你:运放参考电压旁路电容的选型与避坑全攻略

别让‘单电源供电’坑了你:运放参考电压旁路电容的选型与避坑全攻略 在单电源供电的运算放大器电路中,参考电压的稳定性往往决定了整个系统的性能。许多工程师习惯性地在Vcc/2分压点添加旁路电容,却不知这个看似合理的操作可能引发灾难性振荡…...

从开发者视角浅谈Taotoken用量看板对于日常调试与优化的辅助作用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从开发者视角浅谈Taotoken用量看板对于日常调试与优化的辅助作用 在日常开发工作中,当我们接入大模型API来构建智能功能…...

Linux驱动开发:/proc接口创建与安全实现指南

1. 项目概述:为什么我们需要关注/proc接口?在Linux驱动开发的世界里,与用户空间进行数据交换是家常便饭。你写了一个驱动,控制着某个硬件,但总得有个“窗口”让系统管理员或者上层应用能看看它运行得怎么样&#xff0c…...

Python简单算法题

1.字符串中的第一个唯一字符def first_uniq_char(s: str) -> int:from collections import Countercount Counter(s)for i, ch in enumerate(s):if count[ch] 1:return ireturn -12. 合并两个有序数组(双指针,in-place)题目:…...

Python实现“打家劫舍“的一种方法

Python实现“打家劫舍“的一种方法 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 …...

AI开始替人跑任务后,真正决定体验的不是模型,而是向量引擎

AI开始替人跑任务后,真正决定体验的不是模型,而是向量引擎为什么这篇文章值得你现在看 过去一年,很多人聊AI,张口就是哪个模型更强。 有人追Gemini 3.5 Flash。 有人追Qwen新模型。 有人追OpenAI的Responses API和Agent工具链。 也…...

IntelliJ IDEA 2023.3 集成 Maven 3.8.3 保姆级避坑指南:从环境变量到项目构建全流程

IntelliJ IDEA 2023.3 与 Maven 3.8.3 深度集成实战:从零构建企业级Java项目 作为一名长期使用IntelliJ IDEA进行Java开发的工程师,我深刻体会到Maven与IDE无缝集成的重要性。每次新版本发布,那些看似简单的配置背后往往隐藏着令人头疼的兼容…...

华为员工职业发展手册

导读:这份华为员工职业发展手册,围绕员工入职、成长、晋升与激励构建了完整的职业发展体系,核心是明确企业、管理者与员工三方责任,搭建多元发展通道,助力员工与企业共成长。关注公众号:【互联互通社区】&a…...

DS89C420片上SRAM的启用与配置详解

1. 项目概述:DS89C420片上SRAM的启用与配置 在嵌入式开发领域,Dallas Semiconductor(后被Maxim Integrated收购)的DS89C420系列微控制器因其高性能和丰富的外设资源受到工程师青睐。这款基于8051架构的芯片有一个容易被忽视的特性…...

如何在现代显示器上完美重温经典游戏?终极宽屏修复工具包指南

如何在现代显示器上完美重温经典游戏?终极宽屏修复工具包指南 【免费下载链接】WidescreenFixesPack Plugins to make or improve widescreen resolutions support in games, add more features and fix bugs. 项目地址: https://gitcode.com/gh_mirrors/wi/Wides…...

用AI写论文,重复率和AIGC疑似率能同时控制在20%以内吗?实测几款主流软件的结果

2026年的毕业季,学术审核的天,彻底变了。两个月前,我的一位研究生朋友提交了初稿,查重率12%,自己还挺满意。结果导师一句话让他当场emo:“你这AIGC检测率42%,是不是AI代写的?”他愣住…...

如何永久激活IDM?免费IDM激活脚本终极指南

如何永久激活IDM?免费IDM激活脚本终极指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为IDM试用期到期而烦恼吗?IDM Activation …...

SpringBoot-Scan:面向红队的SpringBoot资产指纹与测绘工作流

1. 这不是又一个“SpringBoot漏洞扫描器”教程,而是一份真实红队队员的资产测绘工作流你有没有遇到过这样的情况:手头刚拿到一个目标域名,技术栈标注着“SpringBoot 2.7.x”,但连它到底跑在哪个端口、是否启用了Actuator、有没有暴…...

5分钟快速上手:BepInEx游戏插件框架完全指南

5分钟快速上手:BepInEx游戏插件框架完全指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款强大的游戏模组和插件框架,专门为Unity Mono、IL…...

OAuth 2.0 client_id深度解析:从规范到安全实践

1. 引言:一个字符串背后的身份体系 在 OAuth 2.0 的整个生态里,client_id 是出现频率最高却最容易被忽视的参数之一。它几乎出现在每一个授权请求的 URL 里,开发者往往只是将其视为"配置项",从 IdP 控制台粘贴过来填进…...

基于VSCode与CMake的G32R501 MCU现代化开发环境搭建实战

1. 项目概述:为什么选择这套组合拳? 最近在折腾极海半导体的G32R501这款MCU,发现身边不少朋友在搭建开发环境时,要么被臃肿的IDE拖慢速度,要么在构建配置上反复踩坑。我自己的习惯是,能用轻量化工具链搞定的…...

如何快速掌握洛雪音乐音源:新手小白也能轻松解锁全网高品质音乐

如何快速掌握洛雪音乐音源:新手小白也能轻松解锁全网高品质音乐 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 还在为找不到心仪歌曲的高品质音源而烦恼吗?lxmusic-项目为…...

案例之RNN案例_AI歌词生成器

案例之RNN案例_AI歌词生成器...

DECA加速器:神经网络模型压缩的硬件优化方案

1. DECA加速器:神经网络模型压缩的硬件突围在AI推理领域,模型压缩技术如同给神经网络"瘦身"——通过量化和稀疏化减少参数规模,但压缩后的数据需要解压才能计算,这个"拆包装"的过程往往成为性能瓶颈。传统CPU…...

VutronMusic:构建现代化跨平台音乐播放器的技术实现方案

VutronMusic:构建现代化跨平台音乐播放器的技术实现方案 【免费下载链接】VutronMusic 高颜值的第三方网易云播放器;支持流媒体音乐,如navidrome、jellyfin、emby;支持本地音乐播放、离线歌单、逐字歌词、桌面歌词、Touch Bar歌词…...

别再只会用`docker system prune`了!聊聊Docker磁盘清理的5个隐藏场景与实战命令

别再只会用docker system prune了!聊聊Docker磁盘清理的5个隐藏场景与实战命令 Docker作为现代开发与运维的核心工具,其便捷性背后往往隐藏着磁盘管理的复杂性。当docker system prune成为大多数人的清理"万能药"时,真正棘手的磁盘…...