在我們springboot項目中使用的是 elasticsearch-rest-high-level-client這個ES官方推薦的客戶端
當有需求批量刪除過期數(shù)據(jù)一開始使用的是deleteByQuery方法唠梨,在要刪除的數(shù)據(jù)比較少的時候沒問題帅容,達到幾十萬條的時候會報 socket超時異常辅辩,但是命令不會中斷贺嫂,仍然會執(zhí)行完信轿,把我們需要delete的數(shù)據(jù)刪完隘庄,就是看不到結(jié)果旅敷,
這時候我們可以
- 不管它反正能刪除成功
- 限制每次刪除的記錄數(shù),setSize就可以做到冬阳,循環(huán)分次刪除蛤虐,直到刪完
- socketTimeOut 將超時時間設(shè)置到足夠大,等待返回結(jié)果
- 使用異步刪除API,異步獲取結(jié)果
很明顯最后一種最合理肝陪,作為一個有追求的程序員看不見程序運行結(jié)果怎么呢
這個時候我們可以用deleteByQueryAsync :官方文檔提供異步調(diào)用方式驳庭,用listener監(jiān)聽返回結(jié)果
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NEW_ORDER_INDEX_NAME);
//可限制刪除記錄數(shù) setSize()
//每批次刪除數(shù)量 默認即1000
deleteByQueryRequest.setBatchSize(CommonConstants.BATCH_SIZE_OF_DEL);
deleteByQueryRequest.setQuery(queryBuilder);
ActionListener listener = new DelEsListener();
esClient.deleteByQueryAsync(deleteByQueryRequest, RequestOptions.DEFAULT, listener);
監(jiān)聽類很簡單,實現(xiàn) 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);
}
}
成功的結(jié)果長這個樣子
[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=[]]
重點是刪除條數(shù) 和 執(zhí)行批次饲常, 批次=影響數(shù)據(jù)量/設(shè)置的批次大小+1
同理 批量select insert update 都有async異步調(diào)用的方法蹲堂。
注意:發(fā)現(xiàn)rest-high-level-client 6.7及之后的版本才發(fā)現(xiàn)有批量的方法