elasticsearchTemplate 多个字段一次性聚合统计

本文介绍如何使用Elasticsearch的Script Aggregation实现通过hospitalId和hospitalName同时聚合查询,提升用户查找医院的效率,展示了从数据到查询结果的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现有一个机构表 有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]);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值