elasticsearch默认输出最多一万条
查询第10001条数据开始就会报错:Result window is too large, from + size must be less than or equal to
但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。
searchSourceBuilder.trackTotalHits(true);
try {
RestHighLevelClient client = ESUtil.getRestHighLevelClient();
SearchRequest searchRequest = new SearchRequest(OperatorConstant.NGSOC_INTELLIGENCE_IOC_DETAIL);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); // 构建搜索条件
List<IntelligenceIocDetailDO> list = new LinkedList<>();
// 查询条件,我们可以使用QueryBuilders 工具类来实现
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//跟关联键查询
boolQueryBuilder.must(QueryBuilders.termQuery(OperatorConstant.IOC_ID, param.getIoc_id()));
sourceBuilder.sort(OperatorConstant.UPDATE_TIME, SortOrder.DESC); //根据更新时间降序查询
//elasticsearch默认输出最多一万条,设置trackTotalHits为true,取消限制
sourceBuilder.trackTotalHits(true);
sourceBuilder.query(boolQueryBuilder);
sourceBuilder.size(param.getSize());
//起始位置从...开始
sourceBuilder.from((param.getPage() - 1) * param.getLimit());
sourceBuilder.size(param.getLimit());
sourceBuilder.timeout(new TimeValue(OperatorConstant.TYPE_SIXTY, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
if (search.getHits().getTotalHits().value > 0) {
SearchHit[] hits = search.getHits().getHits();
Map<Integer, String> dicMap = getDic();
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSourceAsMap();
IntelligenceIocDetailDO intelligenceIocDetailDO = JSON.parseObject(JSON.toJSONString(map), IntelligenceIocDetailDO.class);
intelligenceIocDetailDO.setIoc_category_name(dicMap.get(intelligenceIocDetailDO.getIoc_category()));
list.add(intelligenceIocDetailDO);
}
}
return new ResultListDO<>(MessageCode.EXECUTE_SUCCESS, search.getHits().getTotalHits().value, list);
} catch (Exception e) {
log.error("method:detailList,param: " + JSON.toJSONString(param) + ", ret:KnowledgeLog error", e);
return new ResultListDO<>(MessageCode.DATABASE_ERROR);
}