如何在Elasticsearch中删除跨多个索引的相同Data_id关联文档
Elasticsearch跨索引关联文档删除方案
你提到的语句可行性说明
你写的DELETE /sample_1, sample_2/_doc/224345565逻辑是可行的,但是有两个语法问题需要修正:
- ES的索引名大小写敏感,你示例中的索引为
Sample_1、Sample_2,语句中写小写sample_1会匹配失败 - 多个索引之间不能加空格,否则会被识别为无效路径
修正后的正确单ID批量删除语句为:
DELETE /Sample_1,Sample_2/_doc/224345565
注意:该语句仅适用于你两个索引中的文档_id就是Data_id的值的场景,如果Data_id只是文档内的普通字段、文档_id为ES自动生成,则不能使用该语句,需要用
_delete_by_query方案。
完整操作步骤
分两种场景:
场景1:已经确认要删除的Data_id为224345565
- 如果Data_id是文档_id:直接执行上面修正后的DELETE语句即可,一次请求就能同步删除两个索引中的对应文档。
- 如果Data_id是普通字段:执行以下
_delete_by_query语句:
POST /Sample_1,Sample_2/_delete_by_query { "query": { "term": { "Data_id": 224345565 } } }
场景2:仅知道要删除Sample_1中Name为HCM的文档,不知道对应Data_id
第一步:先查询匹配文档的Data_id:
GET /Sample_1/_search { "query": { "term": { "Name.keyword": "HCM" } }, "_source": ["Data_id"] }
第二步:拿到返回结果中的Data_id后,执行场景1中的删除操作即可。
注意事项
- 执行删除前建议先将删除语句中的
DELETE/_delete_by_query替换为GET/_search执行,验证匹配的文档数量和内容是否正确,避免误删 - 生产环境数据量较大时,可在
_delete_by_query接口后加?wait_for_completion=false参数异步执行删除,避免请求超时
内容的提问来源于stack exchange,提问作者Josley
相关产品推荐
相关产品推荐

