随着业务量的增多,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分钟。