//滚动查询的Scroll
private static final Scroll SCROLL = new Scroll(TimeValue.timeValueMillis(180000L));
private static int ES_PAGE_SIZE = 5000;
public Map<String, WxGroupMemberDTO> getChatMemberByUserCode(List<String> fromList) {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(QueryBuilders.termsQuery("userId", fromList));
sourceBuilder.query(boolBuilder);
SearchRequest searchRequest = new SearchRequest(index);
//每次滚动的长度
sourceBuilder.size(ES_PAGE_SIZE);
//加入scroll和构造器
//指定scroll的生存时间
searchRequest.scroll(SCROLL);
searchRequest.source(sourceBuilder);
//存储scroll的list
List<String> scrollIdList = new ArrayList<>();
searchRequest.source(sourceBuilder);
Map<String, WxGroupMemberDTO> wxGroupMemberDTOMap = new HashMap<>();
try {
searchRequest.indicesOptions(IndicesOptions.fromOptions(true, true, true, false));
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
log.info("wxGroupMemberDTOMap首次查询数量====》" + searchResponse.getHits().getHits().length);
//拿到第一个ScrollId(游标)
String scrollId = searchResponse.getScrollId();
scrollIdList.add(scrollId);
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
WxGroupMemberDTO wxGroupMember = JSONObject.parseObject(searchHit.getSourceAsString(), WxGroupMemberDTO.class);
wxGroupMemberDTOMap.put(wxGroupMember.getUserId(), wxGroupMember);
}
while (true) {
// 循环创建SearchScrollRequest
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
//再指定scroll的生存时间,若不指定它会归零
scrollRequest.scroll(SCROLL);
//执行查询获取结果
SearchResponse scrollResp = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
//判断是否查询到了数据输出
SearchHit[] hits = scrollResp.getHits().getHits();
if (hits != null && hits.length > 0) {
log.info("wxGroupMemberDTOMap滚动查询数量====》" + hits.length);
for (SearchHit hit : hits) {
WxGroupMemberDTO wxGroupMember = JSONObject.parseObject(hit.getSourceAsString(), WxGroupMemberDTO.class);
wxGroupMemberDTOMap.put(wxGroupMember.getUserId(), wxGroupMember);
}
} else {
//若无数据则退出
break;
}
}
} catch (Exception e) {
log.warn("Elastic状态出现错误:{}", JSON.toJSONString(e));
} finally {
//清理scroll,释放资源
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.setScrollIds(scrollIdList);
try {
restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
log.error("滚动查询删除失败");
}
}
return wxGroupMemberDTOMap;
}
04-05