随着业务量的增多,es中数据越来越多,但有些数据其实后期并无业务用途,可直接做物理删除,程序里做兼容,但历史每个月的索引里的数据需要处理这部分冗余数据。
es提供_delete_by_query 根据查询条件进行删除的操作,但如果待删除数据量比较大,很可能导致客户端超时,直接返回502; 可以增加wait_for_completion=false,立马返回一个任务id,根据任务id查询任务执行的进度。
(1)异步执行
POST /**order_202310/_delete_by_query?wait_for_completion=false
这里查询条件根据业务不同,组合不同的条件。(这里查不存在用户id,且类型是4,状态是7,8的订单)
{"query": {"bool": {"must_not": [{"exists": {"field": "userUniqueid"}}], "must": [{"term": {"upDefault1": {"value": "4"}}},{"terms": {"status": ["7","8"]}}]}}
}
返回:
(2)根据id查询task执行情况
GET /_tasks/${taskId}
执行结果如下图所示:
(3)终止任务
POST /_tasks/${taskId}/_cancel
(4)实际执行时间
删除132w左右的数据,用了451830秒,约7.5分钟。