使用scoll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来
scoll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的
采用基于_doc进行排序的方式,性能较高
每次发送scroll请求,我们还需要指定一个scoll参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能完成就可以了
public void autoOnlineGoodsSpuByOnlineTimeScroll(String onlineTime) {
// 构建查询指定时间之前未上架的商品信息的请求体
SearchSourceBuilder sourceBuilder = this.buildOnlineTimeGoodsSpuSource(onlineTime);
// 查询请求
SearchRequest searchRequest = new SearchRequest(goodsIndexAlias);
// 指定scroll失效时间为60秒,
Scroll scroll = new Scroll(TimeValue.timeValueSeconds(scrollExpireSeconds));
searchRequest.scroll(scroll);
// 设定每次查询数据量大小
sourceBuilder.size(autoOnlinePageSize);
searchRequest.source(sourceBuilder);
try {
LOGGER.info("ES请求参数:{}", searchRequest.source().toString());
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// scroll查询的id
String scrollId = searchResponse.getScrollId();
// 构建查询结果
List<AdminGoodsSpu> adminGoodsSpuList = this.buildAutoOnlineSearchResult(searchResponse);
while (!CollectionUtils.isEmpty(adminGoodsSpuList)) {
// 自动上架商品
autoOnlineGoodsSpu(adminGoodsSpuList);
// 重新构建scroll查询
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(scroll);
// 发起查询
searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
// scroll查询的id
scrollId = searchResponse.getScrollId();
// 构建查询结果
adminGoodsSpuList = this.buildAutoOnlineSearchResult(searchResponse);
}
LOGGER.info("结束调用AdminGoodsServiceImpl类autoOnlineGoodsSpuWithBeforeTimeWithScroll方法");
} catch (IOException e) {
LOGGER.error("自动上架指定时间之前的商品", e);
}
}