在使用es的过程中,有些时候会遇到搜索全部数据的场景,众所周知es最大的搜索的数量就是10000,那么碰到总数大于10000时,我们就要用到深度分页这个功能。
下面是一段浅写的深度分页的代码,供日后自己用
/**
*深度分页搜索
*
*/
public void deepSearch(){
SearchRequst searchRequst = new SearchRequst("索引名称");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//创建构造条件
searchSourceBuilder.source(searchSourceBuilder);
//执行搜索
Long total = 0L;
try{
//esMapper其实就是封装的restHighLevelClient
SearchResponse searchResponse = esMapper.search(searchRequest,RequestOptions.DEFAULT);
if(searchResponse == null
|| searchResponse.getHits().getHits() == null
|| searchResponse.getHits().getHits().length == 0){
log.info("深度分页搜索结果为空");
return null;
}
SearchHit[] searchHits = searchResponse.gitHit().git();
while(searchHits.length > 0){
total += searchHits.length;
searchSourceBuilder.searchAfter(searchHits[searchHits.length - 1].getSortValues());
searchResponse = esMapper.search(searchRequest,RequestOptions.DEFAULT);
if(searchResponse == null
|| searchResponse.getHits().getHits() == null
|| searchResponse.getHits().getHits().length == 0){
log.info("深度分页搜索结束循环!");
break;
}
searchHits = searchResponse.getHits().getHits();
}
}catch(IOException e){
log.error("深度分页搜索发生异常");
}
log.info("深度分页搜索结束,召回的文档总数为:{}",total);
}