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

在 Elasticsearch 中删除文档中的某个字段

作者:来自 Elastic Kofi Bartlett

探索在 Elasticsearch 中删除文档字段的方法。

更多有关 Elasticsearch 文档的操作,请详细阅读文章 “开始使用 Elasticsearch (1)”。

想获得 Elastic 认证?查看下一期 Elasticsearch Engineer 培训的时间!

Elasticsearch 拥有大量新功能,帮助你为你的使用场景构建最佳搜索解决方案。查看我们的示例 notebooks 了解更多内容,开始免费的云端试用,或现在就在本地机器上体验 Elastic。


在 Elasticsearch 中,从文档中删除字段是一个常见需求。当你想从索引中移除不必要或过时的信息时,这会很有用。本文将讨论在 Elasticsearch 中删除文档字段的不同方法,并附带示例和逐步说明。

方法一:使用 Update API

Update API 允许你通过提供脚本来更新文档的内容。你可以使用该 API 将字段设置为 null,或者更好地,直接从文档中删除该字段。以下是执行此操作的分步指南:

  1. 确定你要更新的文档的索引、文档类型(如果使用的是 Elasticsearch 6.x 或更早版本)和文档 ID。

  2. 使用 Update API,并提供一个脚本,该脚本将字段设置为 null,或直接从文档中移除该字段。以下示例演示了如何从索引为 my_index,ID 为 1 的文档中删除名为 field_to_delete 的字段:

    POST /my_index/_update/1
    {"script": {"source": "ctx._source.remove('field_to_delete')","lang": "painless"}
    }
    
  3. 执行请求。如果成功,Elasticsearch 会返回一个响应,表示文档已被更新。

注意:此方法只会从指定文档中移除字段。该字段仍然会存在于映射和索引中的其他文档中。

方法二:使用修改后的源数据进行重新索引

如果你想从索引中的所有文档中删除一个字段,可以使用 Reindex API 创建一个带有修改后源数据的新索引。操作如下:

  1. 创建一个与原始索引具有相同设置和映射的新索引。你可以使用 Get Index API 获取原始索引的设置和映射。

  2. 使用 Reindex API 将文档从原始索引复制到新索引,同时从源中移除该字段。以下示例演示了如何从 “my_index” 索引中的所有文档中删除 “field_to_delete” 字段:

    POST /_reindex
    {"source": {"index": "my_index"},"dest": {"index": "new_index"},"script": {"source": "ctx._source.remove('field_to_delete')"}
    }
  3. 验证新索引中是否包含已删除该字段的正确文档

  4. 如果一切正常,你可以删除原始索引,并在需要时为新索引添加一个别名,使其名称与原始索引相同。

方法三:更新映射并重新索引

如果你想从映射和索引中的所有文档中删除一个字段,可以更新映射并重新索引文档。操作如下:

  1. 创建一个与原始索引具有相同设置的新索引。

  2. 使用 Get Mapping API 获取原始索引的映射。

  3. 修改映射,移除你想删除的字段。

  4. 使用 Put Mapping API 将修改后的映射应用到新索引。

  5. 使用 Reindex API 将文档从原始索引复制到新索引,方式同方法二。

  6. 验证新索引是否包含已删除该字段的正确文档,且该字段不再出现在映射中。

  7. 如果一切正常,你可以删除原始索引,并在需要时为新索引添加一个别名,使其名称与原始索引相同。

结论

本文讨论了在 Elasticsearch 中删除文档字段的三种方法:使用 Update API、通过修改后的 source 重新索引,以及更新映射后重新索引。每种方法都有其适用场景和权衡,请根据实际需求选择合适的方法。在应用到生产环境之前,请务必测试你的变更并验证结果。

原文:Deleting a field from a document in Elasticsearch - Elasticsearch Labs

http://www.xdnf.cn/news/5150.html

相关文章:

  • Web自动化测试入门详解
  • 【深入理解SpringCloud微服务】手写实现一个微服务分布式事务组件
  • 如何阅读、学习 Linux 2 内核源代码 ?
  • ADI ADRV902x的射频模拟信号输入输出端口的巴伦匹配
  • nvme Unable to change power state from D3cold to D0, device inaccessible
  • akshare爬虫限制,pywencai频繁升级个人做量化,稳定数据源和券商的选择
  • HTTP 的发展史:从前端视角看网络协议的演进
  • Java字节缓冲流高效读写文件指南
  • 【论文阅读】——一些小tips和测试
  • DS18B20温度传感器
  • 问题解决思路:numpy:DLL load failed
  • 贪心算法专题(Part2)
  • React Hooks 精要:从入门到精通的进阶之路
  • 单片机-STM32部分:10-2、逻辑分析仪
  • 【软件工程】基于频谱的缺陷定位
  • openlayers利用已知的三个经纬度的坐标点 , 绘制一个贝塞尔曲线
  • LeetCode 39 LeetCode 40 组合总和问题详解:回溯算法与剪枝优化(Java实现)
  • 鸿蒙 所有API缩略图鉴
  • PyTorch API 10 - benchmark、data、批处理、命名张量
  • 如何创建伪服务器,伪接口
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月10日第73弹
  • linux搭建hadoop学习
  • 测试左移系列-产品经理实战-实战认知1
  • 简易图片编辑工具,支持抠图和替换背景
  • 如何启动vue项目及vue语法组件化不同标签应对的作用说明
  • 使用互斥锁保护临界
  • “AI+城市治理”智能化解决方案
  • 前端面试每日三题 - Day 30
  • VScode密钥(公钥,私钥)实现免密登录【很细,很全,附带一些没免密登录成功的一些解决方法】
  • [Linux]多线程(二)原生线程库---pthread库的使用