在我们springboot项目中使用的是 elasticsearch-rest-high-level-client这个ES官方推荐的客户端
当有需求批量删除过期数据一开始使用的是deleteByQuery方法,在要删除的数据比较少的时候没问题,达到几十万条的时候会报 socket超时异常,但是命令不会中断,仍然会执行完,把我们需要delete的数据删完,就是看不到结果,
这时候我们可以
- 不管它反正能删除成功
- 限制每次删除的记录数,setSize就可以做到,循环分次删除,直到删完
- socketTimeOut 将超时时间设置到足够大,等待返回结果
- 使用异步删除API,异步获取结果
很明显最后一种最合理,作为一个有追求的程序员看不见程序运行结果怎么呢
这个时候我们可以用deleteByQueryAsync :官方文档提供异步调用方式,用listener监听返回结果
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NEW_ORDER_INDEX_NAME);
//可限制删除记录数 setSize()
//每批次删除数量 默认即1000
deleteByQueryRequest.setBatchSize(CommonConstants.BATCH_SIZE_OF_DEL);
deleteByQueryRequest.setQuery(queryBuilder);
ActionListener listener = new DelEsListener();
esClient.deleteByQueryAsync(deleteByQueryRequest, RequestOptions.DEFAULT, listener);
监听类很简单,实现 ActionListener<BulkByScrollResponse>接口 重写两个方法一个接受成功,一个接受失败
public class DelEsListener implements ActionListener<BulkByScrollResponse> {
private static final Logger logger = LoggerFactory.getLogger(SearchManager.class);
@Override
public void onResponse(BulkByScrollResponse bulkResponse) {
logger.info("delOrder-record-info[success] bulkResponse:{} ", bulkResponse.toString());
}
@Override
public void onFailure(Exception e) {
logger.info("delOrder-record-info[fail] error:{} ", e);
}
}
成功的结果长这个样子
[took=104ms,timed_out=false,sliceId=null,updated=0,created=0,deleted=633,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s,bulk_failures=[],search_failures=[]]
重点是删除条数 和 执行批次, 批次=影响数据量/设置的批次大小+1
同理 批量select insert update 都有async异步调用的方法。
注意:发现rest-high-level-client 6.7及之后的版本才发现有批量的方法