当前位置: 首页 > article >正文

Elasticsearch 聚合查询(Aggregation)详解

Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景。

实例:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.Avg;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        // 首先创建RestClient,后续章节通过RestClient对象进行参数配置。
        RestClientBuilder restClientBuilder = RestClient.builder(
                new HttpHost("localhost", 9200, "http"), // 设置ES服务地址,支持多个
                new HttpHost("localhost", 9201, "http"));

        // 创建RestHighLevelClient,请求都是通过RestHighLevelClient实例发出去的。
        RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);

        // 创建SearchRequest对象, 设置查询索引名=order
        SearchRequest searchRequest = new SearchRequest("order");
        // 通过SearchSourceBuilder构建搜索参数
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 通过QueryBuilders构建ES查询条件,这里查询所有文档,复杂的查询语句设置请参考前面的章节。
        builder.query(QueryBuilders.matchAllQuery());

        // 创建terms桶聚合,聚合名字=by_shop, 字段=shop_id,根据shop_id分组
        TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("by_shop")
                .field("shop_id");

        // 嵌套聚合
        // 设置Avg指标聚合,聚合名字=avg_price, 字段=price,计算平均价格
        aggregationBuilder.subAggregation(AggregationBuilders.avg("avg_price").field("price"));

        // 设置聚合查询
        builder.aggregation(aggregationBuilder);

        // 设置搜索条件
        searchRequest.source(builder);
        // 如果只想返回聚合统计结果,不想返回查询结果可以将分页大小设置为0
        builder.size(0);

        // 执行ES请求
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        // 处理聚合查询结果
        Aggregations aggregations = searchResponse.getAggregations();
        // 根据by_shop名字查询terms聚合结果
        Terms byShopAggregation = aggregations.get("by_shop");

        // 遍历terms聚合结果
        for (Terms.Bucket bucket  : byShopAggregation.getBuckets()) {
            // 因为是根据shop_id分组,因此可以直接将桶的key转换成int类型
            int shopId = bucket.getKeyAsNumber().intValue();

            // 根据avg_price聚合名字,获取嵌套聚合结果
            Avg avg = bucket.getAggregations().get("avg_price");
            // 获取平均价格
            double avgPrice = avg.getValue();
        }

        // 关闭ES Client
        client.close();
    }
}

例子聚合统计的效果等价SQL:

select shop_id, avg(price) as avg_price from order group by shop_id


http://www.kler.cn/a/150203.html

相关文章:

  • 在K8s平台部署个人博客
  • 华为OD机试 - 无重复字符的元素长度乘积的最大值(Python/JS/C/C++ 2024 C卷 100分)
  • 【CSS】——基础入门常见操作
  • 【Java知识】java进阶-一个好用的java应用分析工具arthas
  • 只允许指定ip远程连接ssh
  • 解决 ClickHouse 高可用集群中 VRID 冲突问题:基于 chproxy 和 keepalived 的实践分析
  • 虚拟机指定开放数据库3306端口
  • Golang开发之------ Beego框架
  • 异步操作的方法
  • genimage 打包镜像
  • ESP32-Web-Server编程- WebSocket 编程
  • leetcode二叉树
  • Spring Boot项目Service类单元测试自动生成
  • TikTok区块链实践:数字社交媒体的去中心化未来
  • 记录一次登录相关bug
  • Hive_last_value()
  • 解决QT信号在信号和槽连接前发出而导致槽函数未调用问题
  • 爬虫代理技术与构建本地代理池的实践
  • 亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(二)
  • Java LeetCode篇-深入了解关于单链表的经典解法
  • Linux命令中的符号
  • 初学者如何入门深度学习:以手写数字字符识别为例看AI 的学习路径,一图胜千言!
  • 福德植保无人机:农业科技的新篇章
  • 小航助学题库蓝桥杯题库c++选拔赛(23年8月)(含题库教师学生账号)
  • 卷积神经网络(CNN)注意力检测
  • 统计英语单词