在搜索时,结果中的 hits.total 信息中会包含一个整数值表示文档数,当实际文档数小于10000时显示具体数量,当大于10000时,只显示10000并且包含另一个字段relation来表示是否大于10000:

 而要在文档数大于10000时获取实际的数量,需要加入参数:track_total_hits

track_total_hits=true表示显示实际的文档数,此时hits.total的会变成:

 relatiion为eq表示value值等于文档数值。

使用java api时需要设置如下属性:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(pageNum - 1);
sourceBuilder.size(pageSize);

sourceBuilder.trackTotalHits(true);

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX_NAME);
searchRequest.source(sourceBuilder);

try {
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	RestStatus restStatus = searchResponse.status();
	if (restStatus != RestStatus.OK) {
		return null;
	}

	SearchHits searchHits = searchResponse.getHits();
	for (SearchHit hit : searchHits.getHits()) {
		String source = hit.getSourceAsString();
		ElasticsearchBoxBill book = JSON.parseObject(source, ElasticsearchBoxBill.class);
		list.add(book);
	}

	long totalHits = searchHits.getTotalHits().value;
			
	TimeValue took = searchResponse.getTook();
	log.info("查询成功!请求参数: {}, 用时{}毫秒" + searchRequest.source().toString() + took.millis());

	TableDataInfo tableDataInfo = getDataTable(list);

	// 设置查询到的记录数
	tableDataInfo.setTotal(totalHits);

	log.info("1.结束查询ES!");

	return tableDataInfo;

		} catch (IOException e) {
			e.printStackTrace();
			log.error("IO异常查询失败!原因: {}" + e.getMessage() + e.toString());
		} catch (Exception e) {
			e.printStackTrace();
			log.error("查询失败!原因: {}" + e.getMessage() + e.toString());
		}

其中最主要的就是sourceBuilder.trackTotalHits(true);


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐