SpringBoot ElasticSearch 聚合统计

SpringBoot ElasticSearch 聚合统计

Spring Boot和Elasticsearch的集成主要涉及使用Spring Data Elasticsearch库。Elasticsearch是一个分布式搜索引擎,它提供了丰富的RESTful API,用于索引、搜索和分析大量数据。

在Spring Boot中,你可以使用Spring Data Elasticsearch来简化与Elasticsearch的交互。Spring Data Elasticsearch提供了对Elasticsearch的高级查询、聚合和其他操作的支持。

聚合(Aggregation): 聚合是一种在Elasticsearch中进行数据分析的方式。它允许你对数据集执行各种统计、计算和分析操作。聚合框架支持的一些常见聚合类型包括:

BucketAggregations: 将文档分配到不同的"桶"中,类似于SQL中的GROUP BY。常见的桶聚合包括terms、date histogram等。

MetricAggregations: 计算文档字段的度量值,如求和、平均值、最大值、最小值等。

PipelineAggregations: 允许你在其他聚合的结果上执行进一步的操作,类似于数据流管道。

Spring Data Elasticsearch中的聚合支持: Spring Data Elasticsearch通过ElasticsearchTemplate或ElasticsearchRepository接口提供对Elasticsearch聚合的支持。你可以使用NativeSearchQueryBuilder构建查询,然后使用addAggregation方法添加各种聚合。

java 复制代码
package org.jeecg.module.mark.task;

import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.MinAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.ValueCountAggregationBuilder;
import org.jeecg.modules.mark.common.es.entity.AudioMarkInfo;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

@Slf4j
@SpringBootTest
public class Test {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    @Test
    public void count() {

        String indexName = "app_student_1";

        List<String> ids = new ArrayList<>();
        ids.add("1");
        ids.add("2");

        NativeSearchQueryBuilder query = new NativeSearchQueryBuilder();
        query.withQuery(QueryBuilders.termsQuery("id", ids));

        TermsAggregationBuilder group = AggregationBuilders.terms("group").field("id");

        // 分组 求和
        SumAggregationBuilder math = AggregationBuilders.sum("math").field("math");
        AggregationBuilder english = AggregationBuilders.filter("english",
                        QueryBuilders.termQuery("status", 1)).
                subAggregation(AggregationBuilders.count("english").field("id"));
        group.subAggregation(math);
        group.subAggregation(english);

        // 分组 求平均数
        AvgAggregationBuilder science = AggregationBuilders.avg("science").field("science");
        // 分组 求最小
        MinAggregationBuilder geography = AggregationBuilders.min("geography").field("geography");
        // 分组 求最大
        MinAggregationBuilder chemistry = AggregationBuilders.min("chemistry").field("chemistry");
        // 分组 统计
        ValueCountAggregationBuilder physics = AggregationBuilders.count("physics").field("physics");

        query.addAggregation(science);
        query.addAggregation(geography);
        query.addAggregation(chemistry);
        query.addAggregation(physics);

        SearchHits<AudioMarkInfo> search = restTemplate.search(query.build(), AudioMarkInfo.class,
                IndexCoordinates.of(indexName));

        Aggregations aggregations = search.getAggregations();
        System.out.println(aggregations);
        ParsedStringTerms terms = aggregations.get("group");
        List<? extends Terms.Bucket> buckets = terms.getBuckets();

        Map<String, Map<String, Object>> result = new HashMap<>();
        for (Terms.Bucket bucket : buckets) {
            String taskId = bucket.getKeyAsString();
            long totalCount = buckets.get(0).getDocCount();
            // 保存数据
            Map<String, Object> tmp = new HashMap<>((int) totalCount);
            tmp.put("total", totalCount);
            result.put(taskId, tmp);
            List<Aggregation> lists = bucket.getAggregations().asList();
            for (Aggregation list : lists) {
                Map<String, Object> map = JSONUtil.toBean(JSONUtil.toJsonStr(list), Map.class);
                if (MapUtil.isEmpty(map)) {
                    continue;
                }
                Object value = null == map.get("value") ? map.get("docCount") : map.get("value");
                result.get(taskId).put((String) map.get("name"), value);
            }
        }

        System.out.println(JSONUtil.toJsonPrettyStr(result));

    }

}
相关推荐
皮皮林55118 分钟前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
Elasticsearch13 小时前
需要知道某个同义词是否实际匹配了你的 Elasticsearch 查询吗?
elasticsearch
用户908324602733 天前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
洛森唛3 天前
ElasticSearch查询语句Query String详解:从入门到精通
后端·elasticsearch
用户8307196840823 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解3 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解3 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记4 天前
Spring Boot Web MVC配置详解
spring boot·后端
洛森唛4 天前
Elasticsearch DSL 查询语法大全:从入门到精通
后端·elasticsearch
初次攀爬者4 天前
Kafka 基础介绍
spring boot·kafka·消息队列