作者:来自 Elastic Kofi Bartlett
探索在 Elasticsearch 中删除文档字段的方法。
更多有关 Elasticsearch 文档的操作,请详细阅读文章 “开始使用 Elasticsearch (1)”。
想获得 Elastic 认证?查看下一期 Elasticsearch Engineer 培训的时间!
Elasticsearch 拥有大量新功能,帮助你为你的使用场景构建最佳搜索解决方案。查看我们的示例 notebooks 了解更多内容,开始免费的云端试用,或现在就在本地机器上体验 Elastic。
在 Elasticsearch 中,从文档中删除字段是一个常见需求。当你想从索引中移除不必要或过时的信息时,这会很有用。本文将讨论在 Elasticsearch 中删除文档字段的不同方法,并附带示例和逐步说明。
方法一:使用 Update API
Update API 允许你通过提供脚本来更新文档的内容。你可以使用该 API 将字段设置为 null,或者更好地,直接从文档中删除该字段。以下是执行此操作的分步指南:
-
确定你要更新的文档的索引、文档类型(如果使用的是 Elasticsearch 6.x 或更早版本)和文档 ID。
-
使用 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" } }
-
执行请求。如果成功,Elasticsearch 会返回一个响应,表示文档已被更新。
注意:此方法只会从指定文档中移除字段。该字段仍然会存在于映射和索引中的其他文档中。
方法二:使用修改后的源数据进行重新索引
如果你想从索引中的所有文档中删除一个字段,可以使用 Reindex API 创建一个带有修改后源数据的新索引。操作如下:
-
创建一个与原始索引具有相同设置和映射的新索引。你可以使用 Get Index API 获取原始索引的设置和映射。
-
使用 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')" } }
-
验证新索引中是否包含已删除该字段的正确文档
-
如果一切正常,你可以删除原始索引,并在需要时为新索引添加一个别名,使其名称与原始索引相同。
方法三:更新映射并重新索引
如果你想从映射和索引中的所有文档中删除一个字段,可以更新映射并重新索引文档。操作如下:
-
创建一个与原始索引具有相同设置的新索引。
-
使用 Get Mapping API 获取原始索引的映射。
-
修改映射,移除你想删除的字段。
-
使用 Put Mapping API 将修改后的映射应用到新索引。
-
使用 Reindex API 将文档从原始索引复制到新索引,方式同方法二。
-
验证新索引是否包含已删除该字段的正确文档,且该字段不再出现在映射中。
-
如果一切正常,你可以删除原始索引,并在需要时为新索引添加一个别名,使其名称与原始索引相同。
结论
本文讨论了在 Elasticsearch 中删除文档字段的三种方法:使用 Update API、通过修改后的 source 重新索引,以及更新映射后重新索引。每种方法都有其适用场景和权衡,请根据实际需求选择合适的方法。在应用到生产环境之前,请务必测试你的变更并验证结果。
原文:Deleting a field from a document in Elasticsearch - Elasticsearch Labs