ElasticSearch(十)【聚合查询】

十、聚合查询


上一篇文章ElasticSearch - SpringBoot整合

简介

聚合英文为Aggregation Aggs,是ES除搜索功能外提供的针对ES数据做统计分析的功能。聚合有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于SQL中的group by再加一些函数方法的操作

注意text类型是不支持聚合的

10.1 Kibana操作聚合查询

下面使用size省略查询结果的输出

terms基于某个字段分组

# 非组名字可以自定义price_group
GET /products/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "price_group": {      
      "terms": {
        "field": "price"
      }
    }
  }
}

在这里插入图片描述

最大值、最小值

# 最大值
GET /products/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "max_price": {      
      "max": {
        "field": "price"
      }
    }
  }
}

# 最小值
GET /products/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "min_price": {      
      "min": {
        "field": "price"
      }
    }
  }
}

在这里插入图片描述

在这里插入图片描述

sum求和、avg平均值

# 求和
GET /products/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "sum_price": {      
      "sum": {
        "field": "price"
      }
    }
  }
}

# 平均值
GET /products/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0, 
  "aggs": {
    "avg_price": {      
      "avg": {
        "field": "price"
      }
    }
  }
}

在这里插入图片描述

在这里插入图片描述

10.2 RestHighLevelClient 操作聚合查询

package com.vinjcent;

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedDoubleTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.metrics.ParsedSum;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.List;

@SpringBootTest
public class RestHighLevelClientAggregationTests {

    private final RestHighLevelClient restHighLevelClient;

    @Autowired
    public RestHighLevelClientAggregationTests(@Qualifier("elasticsearchClient") RestHighLevelClient restHighLevelClient) {
        this.restHighLevelClient = restHighLevelClient;
    }



    /**
     * 基于 term 类型进行聚合,并且基于字段进行分组聚合
     * @throws IOException
     */
    @Test
    public void testAggs() throws IOException {

        // 1.创建请求对象
        SearchRequest searchRequest = new SearchRequest("products");
        // 2.创建查询对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder
                .query(QueryBuilders.matchAllQuery())
                .aggregation(AggregationBuilders.terms("price_group").field("price"))   // 用于设置聚合处理
                .size(0);
        // 3.为请求对象配置查询对象
        searchRequest.source(searchSourceBuilder);
        // 4.接收响应对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        // 5.处理聚合结果
        Aggregations aggregations = searchResponse.getAggregations();
        // 根据字段类型,转移
        ParsedDoubleTerms price_group = aggregations.get("price_group");
        // 解析桶里的内容
        List<? extends Terms.Bucket> buckets = price_group.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            System.out.println(bucket.getKey() + "  " + bucket.getDocCount());
        }
    }


    /**
     * 基于 sum(ParsedSum)、avg(ParsedAvg)、max(ParsedMax)、min(ParsedMin) 函数聚合,
     * @throws IOException
     */
    @Test
    public void testAggsFunction() throws IOException {
        // 1.创建请求对象
        SearchRequest searchRequest = new SearchRequest("products");
        // 2.创建查询对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder
                .query(QueryBuilders.matchAllQuery())
                .aggregation(AggregationBuilders.sum("sum_price").field("price"))   // 用于设置聚合处理,sum、avg、max、min
                .size(0);
        // 3.为请求对象配置查询对象
        searchRequest.source(searchSourceBuilder);
        // 4.接收响应对象
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        // 5.处理聚合结果
        Aggregations aggregations = searchResponse.getAggregations();
        // 根据字段类型,转移    ParsedSum、ParsedAvg、ParsedMax、ParsedMin
        ParsedSum sum_price = aggregations.get("sum_price");
        // 解析桶里的内容
        System.out.println(sum_price.getValue());
    }
    
}

下一篇文章ElasticSearch - 集群搭建

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值