Elasticsearch Java 入门教程之聚合常用功能 Demo (五)

12 篇文章 1 订阅

本教程系列目录:

Github源码:https://github.com/Mengzuozhu/es-demo

AggregationService 聚合常用功能示例:最值、平均值、唯一值数目等

package com.mzz.esdemo.service;

import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation.Bucket;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms;
import org.elasticsearch.search.aggregations.metrics.ParsedCardinality;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.stream.Collectors;

import static org.elasticsearch.search.aggregations.metrics.NumericMetricsAggregation.SingleValue;

/**
 * The type Aggregation service.
 * See
 * <a href="https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high-aggregation-builders.html">
 *
 * @author Zero
 */
@Service
@RequiredArgsConstructor
public class AggregationService {
    private static final String CARDINALITY_SUFFIX = "_cardinality";
    private static final String MAX_SUFFIX = "_max";
    private static final String MIN_SUFFIX = "_min";
    private static final String TERMS_SUFFIX = "_terms";
    private final RestHighLevelClient restHighLevelClient;

    /**
     * Distinct count.
     * See
     * <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.x/search-aggregations-metrics-cardinality-aggregation.html">
     *
     * @param index the index
     * @param field the field
     * @return the distinct count
     */
    public long distinctCount(String index, String field) {
        AggregationBuilder aggregationBuilder = getCardinalityAggregation(field);
        ParsedCardinality parsedCardinality = (ParsedCardinality) aggregate(index, aggregationBuilder);
        return parsedCardinality.getValue();
    }

    /**
     * Min agg double.
     *
     * @param index the index
     * @param field the field
     * @return the double
     */
    public double minAgg(String index, String field) {
        AggregationBuilder aggregationBuilder = AggregationBuilders.min(field + MIN_SUFFIX)
                .field(field);
        return ((SingleValue) aggregate(index, aggregationBuilder)).value();
    }

    /**
     * Max agg double.
     *
     * @param index the index
     * @param field the field
     * @return the double
     */
    public double maxAgg(String index, String field) {
        AggregationBuilder aggregationBuilder = AggregationBuilders.max(field + MAX_SUFFIX)
                .field(field);
        return ((SingleValue) aggregate(index, aggregationBuilder)).value();
    }

    /**
     * Avg agg double.
     *
     * @param index the index
     * @param field the field
     * @return the double
     */
    public double avgAgg(String index, String field) {
        AggregationBuilder aggregationBuilder = AggregationBuilders.avg(field + MIN_SUFFIX)
                .field(field);
        return ((SingleValue) aggregate(index, aggregationBuilder)).value();
    }

    /**
     * Terms count agg.
     *
     * @param index the index
     * @param field the field
     * @return the map
     */
    public Map<Object, Long> termsCountAgg(String index, String field) {
        AggregationBuilder aggregationBuilder = AggregationBuilders.terms(field + TERMS_SUFFIX)
                .field(field);
        ParsedTerms parsedTerms = (ParsedTerms) aggregate(index, aggregationBuilder);
        return parsedTerms.getBuckets()
                .stream()
                .collect(Collectors.toMap(Bucket::getKey, Bucket::getDocCount));
    }

    private static AggregationBuilder getCardinalityAggregation(String field) {
        return AggregationBuilders.cardinality(field + CARDINALITY_SUFFIX)
                .field(field);
    }

    @SneakyThrows
    private Aggregation aggregate(String index, AggregationBuilder aggregationBuilder) {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
                .aggregation(aggregationBuilder);
        SearchRequest searchRequest = new SearchRequest(index)
                .source(sourceBuilder);
        return restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT)
                .getAggregations()
                .get(aggregationBuilder.getName());
    }

}

测试类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值