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

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对象, 设置查询索引名=orderSearchRequest 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);// 如果只想返回聚合统计结果,不想返回查询结果可以将分页大小设置为0builder.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 Clientclient.close();}
}

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

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

http://www.lryc.cn/news/247893.html

相关文章:

  • 数据库其它调优策略
  • 【AI认证笔记】NO.2人工智能的发展
  • Python与设计模式--观察者模式
  • Elasticsearch底层原理分析——新建、索引文档
  • ts实现合并数组对象中key相同的数据
  • C语言--根据成绩判断等级
  • Rust多线程任务,发现有些线程一直获取不到锁【已解决】
  • 【区块链】产品经理的NFT初探
  • 香港服务器减少延迟的几种方法
  • PowerShell命令小记
  • C语言小练
  • Webhook端口中的自签名身份验证
  • CSS预处理器(如Sass或Less):变量、嵌套规则和混合器等高级功能
  • 【Linux】Linux第一个小程序 --- 进度条
  • 每日一练:约瑟夫生者死者小游戏
  • 双指针算法(题目与答案讲解)
  • python服装电商系统vue购物商城django-pycharm毕业设计项目推荐
  • 数据治理技术:研究现状与数据规范
  • 一文彻底理解索引下推
  • Springboot3+vue3从0到1开发实战项目(一)
  • [字符串操作] 有年代的病历单
  • 怎么批量提取文件名字到Excel中?
  • QT搭建的Ros/librviz的GUI软件
  • Docker 概述与安装
  • JS作用域与作用域链
  • elmentui 查看大图组件 点击图片关闭弹窗方法
  • 蓝桥杯官网练习题(最长子序列)
  • Make sure that using this pseudorandom number generator is safe here.
  • 【C/C++】常见模拟题题解
  • TikTok 购物和直播的 5 个简单技巧