Elasticsearch 中批量更新文档(Update By Query)的标准写法

1. 准备阶段:确定目标和条件

复制代码
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest(ArchivesGlobalConstant.PROFILE_INDEX_NAME);
updateByQueryRequest.setDocTypes(ArchivesGlobalConstant.TYPE_NAME);
updateByQueryRequest.setQuery(QueryBuilders.termsQuery("lib_id", libIds));
  • 创建请求对象new UpdateByQueryRequest(...)
    • 意义 :告诉 ES,"我要对 PROFILE_INDEX_NAME 这个索引执行批量更新操作"。
  • 设置类型setDocTypes(...)
    • 意义:限定操作的文档类型(虽然新版 ES 逐渐弱化类型,但旧版客户端代码里还需要写)。
  • 设置查询条件setQuery(...)
    • 意义"找谁?" 。使用 termsQuery 找出所有 lib_idlibIds 列表中的文档。这一步和查数据是一模一样的。

2. 逻辑阶段:定义修改规则(核心)

复制代码
Map<String, Object> params = Maps.newHashMap();
params.put("groupId", groupId);
params.put("groupIds", Lists.newArrayList(groupId));

// ... 中间根据 ADD/REMOVE 选择脚本
updateByQueryRequest.setScript(new Script(...));
  • 准备参数params
    • 意义 :把 Java 里的变量(groupId)包装成 Map,准备传给 ES。这样做的目的是为了防止字符串拼接错误,也方便 ES 做安全检查。
  • 定义脚本new Script(...)
    • 意义"改成什么样?"。这是批量更新的灵魂。
    • 逻辑:把刚才的参数、脚本语言(Painless)、以及具体的修改代码(那个长字符串)组装在一起。
    • 注意 :这里根据 operateTag 判断是执行"添加 ID"还是"删除 ID"的逻辑。

3. 执行阶段:发送指令并处理

复制代码
updateByQueryRequest.setRefresh(true);
updateByQueryRequest.setConflicts("proceed");

try {
    restHighLevelClient.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
    // 错误处理
}
  • 配置选项
    • setRefresh(true)立即生效。更新完马上刷新索引,让数据能立刻被搜索到(如果不设,ES 可能会为了性能稍后才刷新,导致查不到刚改的数据)。
    • setConflicts("proceed")冲突忽略。如果在更新过程中有其他人在修改同一条数据,不要报错停止,而是继续执行下去。
  • 发送请求client.updateByQuery(...)
    • 意义:把请求发给 ES。ES 会根据条件找到文档,然后执行脚本里的逻辑,最后保存。
相关推荐
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
阿里云大数据AI技术10 小时前
更快、更稳、更省:揭秘阿里云 Elasticsearch 存算分离与弹性扩缩
elasticsearch
延凡科技11 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
ifenxi爱分析12 小时前
爱分析最新报告解读:AI数据基础设施与数据中台的区别
大数据·人工智能
阿里云大数据AI技术12 小时前
Search Lake:ES x Paimon 让湖上多模态数据可搜可用
人工智能·elasticsearch·搜索引擎
品牌全球行12 小时前
共商共建共享 链接数字未来——“一带一路数字新城(深圳)会客厅筹备办”揭牌仪式在深圳隆重举行
大数据·人工智能
数智化管理手记14 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
ApacheSeaTunnel15 小时前
Apache SeaTunnel AI CLI Benchmark:7 款大模型、100 个 ETL 任务实测,谁真正能跑起来?
大数据·ai·开源·大模型·数据集成·cli·seatunnel·技术分享·数据同步
电商API_1800790524715 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
小稻穗16 小时前
市场调研样本选型坐标系:2026六家国内样本平台能力横向校验
大数据·运维·数据分析