Elasticsearch如何删除指定索引中除特定ID集合外的所有记录?
解决Elasticsearch保留指定ID删除其余数据的问题
你之前的问题出在用了match查询来匹配多个ID,match并不支持传入数组作为查询值,要匹配多个字段值应该用terms查询。
直接用下面的_delete_by_query请求就能实现你的需求——删除索引中所有ID不在指定列表里的文档:
POST /myindex/_delete_by_query { "query": { "bool": { "must_not": [ { "terms": { "id": [12345, 67890] } } ] } } }
这个请求的逻辑和你写的SQL等价(修正了SQL里的语法问题,应该用NOT IN而不是!=):
DELETE * FROM <my-index> WHERE <id> NOT IN (12345, 67890)
额外提醒
- 如果你的索引数据量很大,
_delete_by_query会占用较多资源,建议在业务低峰期执行; - 可以添加
wait_for_completion=false参数让请求异步执行,避免超时; - 执行前可以先用
_search接口测试这个查询是否能正确筛选出要删除的文档,确保逻辑无误。
内容的提问来源于stack exchange,提问作者Lucas Larsson
相关产品推荐
相关产品推荐

