现有一个机构表 有hospitalId,hospitalName 想统计出的结果是
|hospitalId | hospitalName |count
|- 2238-|-XXXXXXXX医院-|2000
|- 2268-|-XXXXXXXX医院-|2565
当我们通过hospitalId 聚合查询时候 得到的结果是
|hospitalId |count
|- 2238-|2000
|- 2268-|2565
用户根本不知道2238是哪个机构 所以这里可以通过hospitalId 和hospitalName 一次性聚合
// 创建一个查询条件对象
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 拼接查询条件
queryBuilder.should(QueryBuilders.termQuery("字段", "值"));
// 创建聚合查询条件
String script = "doc['" + 字段1 + "'].values +'/'+ doc['" + 字段2 + "'].values +'/'+ doc['" + 字段3 + "'].values"; // 编写script语句
Script script1 = new Script(script); // 新建一个script对象
TermsAggregationBuilder agg = AggregationBuilders.terms("聚合名称").script(script1).size(99999); // 创建一个聚合查询对象
SearchQuery build = new NativeSearchQueryBuilder()
.withQuery(queryBuilder) //添加查询条件
.addAggregation(agg) // 添加聚合条件
.withPageable(PageRequest.of(0, 1)) //符合查询条件的文档分页(不是聚合的分页)
.build();
// 执行查询
AggregatedPage<TestEntity> testEntities = elasticsearchTemplate.queryForPage(build, TestEntity.class);
Terms terms = (Terms) shopDbEntities.getAggregation("聚合名称");
for (Terms.Bucket bucket : terms.getBuckets()) { // 循环取出聚合的值
String keyAsString = bucket.getKeyAsString();
String[] split = keyAsString.split("/"); // 切割取出每个字段
System.out.println("字段1"+split[0]);
System.out.println("字段2"+split[1]);
System.out.println("字段3"+split[2]);
}