Elasticsearch ReIndex REST API与Java高级Rest客户端任务文档处理疑问
解答
是否需要删除任务文档
需要。Java Rest High Level Client的异步Reindex任务提交逻辑和带wait_for_completion=false参数的REST请求完全等价,ES服务端都会在.tasks系统索引中生成对应的持久化任务文档,任务结束后不会自动清理,长期累积会占用集群存储资源,因此在确认任务执行完成、不再需要查询任务状态后,必须手动删除对应的任务文档。
具体操作步骤
步骤1:提交异步任务时获取任务ID
提交任务时会返回SubmittedTask对象,从中提取任务ID并留存:
ReindexRequest reindexReq = new ReindexRequest(); reindexReq.setSourceIndices("源索引名"); reindexReq.setDestIndex("目标索引名"); // 提交异步任务,不阻塞等待执行结果 SubmittedTask submittedTask = client.submitReindexTask(reindexReq, RequestOptions.DEFAULT); // 留存该taskId用于后续状态查询和删除 String taskId = submittedTask.getTaskId();
步骤2:查询任务状态确认已完成
在执行删除前先确认任务已经结束,避免误删正在运行的任务:
GetTaskRequest getTaskReq = new GetTaskRequest(taskId); TaskInfo taskInfo = client.tasks().get(getTaskReq, RequestOptions.DEFAULT); if (taskInfo.isCompleted()) { // 任务已结束,可继续执行删除 // 如需校验执行结果,可读取taskInfo.getStatus()中的返回值判断是否成功 }
步骤3:删除任务文档
// 任务文档存储在系统索引.tasks中,文档ID就是之前留存的taskId DeleteRequest deleteTaskReq = new DeleteRequest(".tasks", taskId); DeleteResponse deleteResp = client.delete(deleteTaskReq, RequestOptions.DEFAULT); // 可通过deleteResp.getResult() == DocWriteResponse.Result.DELETED 判断删除是否成功
批量清理说明
如果需要清理历史遗留的无效任务,也可以直接对.tasks系统索引执行条件删除,比如清理7天前的所有Reindex任务,删除时可加refresh=true参数让清理结果立刻生效。
内容的提问来源于stack exchange,提问作者TheTailOfACat
相关产品推荐
相关产品推荐

