ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合
目录
一、数据聚合
1.1、基本概念
1.1.1、聚合分类
1.1.2、特点
1.2、DSL 实现 Bucket 聚合
1.2.1、Bucket 聚合基础语法
1.2.2、Bucket 聚合结果排序
1.2.3、Bucket 聚合限定范围
1.3、DSL 实现 Metrics 聚合
1.4、基于 JavaRestClient 实现聚合
1.4.1、组装请求
1.4.2、解析响应
1.5、黑马旅游案例
1.5.1、需求
1.5.2、对接前端接口
1.5.3、编写 controller
1.5.4、添加 filters 接口
1.5.5、实现接口
一、数据聚合
1.1、基本概念
1.1.1、聚合分类
聚合(aggregations),就是用来对文档数据的统计分析和运算. 就像之前我们学习过的 mysql,也是有聚合功能,比如可以使用 avg 求平均值,max 求最大值等等,并且需要搭配着 group by 分组使用,而 es 也具备类似这些功能,并且更加丰富.
es 中聚合有以下三大类:
1. 桶(Bucket)聚合:用来对文档分组. 这就类似于 MySQL 中的 group by 了,取名为 “桶”,就好比对垃圾分类一样,对不同的文档起到分类分组的作用.
桶聚合分组最常用的有两个类型:
TermAggregation:按照文档字段值分组(这个实际上就和 mysql 中的 group by 效果是一样的).
Data Histogram:按照日期阶梯分组,例如一周为一组,或者一个月为一组.
2. 度量(Metric)聚合:对分组的每组文档数据做计算,比如 最大值、最小值、平均值等.
这里就和 mysql 中是一样的,比如 avg、max、min...
并且 es 这里还有一个特殊的度量聚合—— "stats",它可以用来同时求平均值、最大值、最小值等等.
3. 管道(pipeline)聚合:用来对其他聚合的结果做聚合.
比如对酒店数据按照品牌进行一个分组,也就是 bucket 聚合,接着算算不同品牌酒店的价格平均值怎么样,这个时候就需要使用到 度量聚合 了,之后如果还需要按照不同品牌价格的平均值进行排序,那么就需要对度量结果再次聚合了.
Ps:管道聚合的方式用到的比较少,不是后面学习的重点.
1.1.2、特点
这里不难看出,刚刚我们所讲到的聚合,是通过 term 对字符串进行分组,也就是说,将来是不能分词的,那么日期、数值、布尔类型就更不用说了.
因此参与聚合的字段一定是不能分词的.
1.2、DSL 实现 Bucket 聚合
1.2.1、Bucket 聚合基础语法
Bucket 聚合语法如下:
GET /索引库名/_search
{"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果"aggs": { // 定义聚合"自定义聚合名": { //给聚合起个名字(自定义)"terms": { // 聚合的类型,按照品牌值聚合,所以选择 terms"field": "字段名", // 参与聚合的字段"size": 20 // 希望获取的聚合结果数量(值设置超过总数,也没有影响)}}}
}
可以看出,聚合的三要素:聚合名称、聚合类型、聚合字段.
例如要按照酒店的品牌对酒店信息进行分类.
1.2.2、Bucket 聚合结果排序
默认情况下,Bucket 聚合会统计 Bucket 内的文档数量,记为 _count,并且按照 _count 降序排序.
例如对酒店品牌分组,并按照每个品牌的酒店数量按照升序排序:
1.2.3、Bucket 聚合限定范围
默认情况下,Bucket 聚合对索引库的所有文档做聚合. 这里我们可以限定要聚合的文档范围,只需要添加 query 条件即可.
Ps:Bucket 聚合限定范围有一个好处:如果说你这个索引库中有上亿条数据,那么找个聚合对内存的消耗还是非常大的,因此,通过 query 限定搜索范围,就可以大大减少对内存的消耗.
例如搜索价格 小于等于 200 的酒店,并按照品牌分类.
1.3、DSL 实现 Metrics 聚合
度量聚合就是在分组后对每组分别进行计算(需要在 aggs 中嵌套一个 aggs,进行子查询).
例如,搜索每个品牌的用户评分(字段是 score)的 min、max、avg 等值.
这里就可以使用 stats 聚合
当然,这里也可以根据用户评分平均值来升序排序,如下
1.4、基于 JavaRestClient 实现聚合
1.4.1、组装请求
示例:按照酒店的品牌对酒店信息进行分类.
@Testpublic void testAggregation() throws IOException {//1.准备 SearchRequestSearchRequest request = new SearchRequest("hotel");//2.准备参数request.source().size(0);request.source().aggregation(AggregationBuilders.terms("brandAgg") //自定义聚合名.field("brand") //根据 brand 的字段聚合.size(10) //展示 10 组数据);//3.发送请求,接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析handlerResponse(response);}
可以对比着 DSL 语句来看
1.4.2、解析响应
//3.解析聚合查询Aggregations aggregations = response.getAggregations();Terms terms = aggregations.get("brandAgg");List<? extends Terms.Bucket> buckets = terms.getBuckets();for (Terms.Bucket bucket : buckets) {String key = bucket.getKeyAsString();System.out.println(key);}
这里可以对照的 DSL 语法来看
1.5、黑马旅游案例
1.5.1、需求
以下搜索页面的品牌、城市、星级信息不因该页面写死的,而是通过聚合索引库中的酒店数据得来的.
1.5.2、对接前端接口
前端页面会向服务器发起一个请求,查询品牌、城市、星级等字段的聚合结果.
这里请求参数和之前的 search 的 RequestParam 完全一样.
这里的响应返回的格式因该是:
{"城市": ["上海","北京"],"品牌": [....]...... }
就是 Map<String, List<String>> 的结构.
1.5.3、编写 controller
这里用来接收前端请求,代码如下.
@RequestMapping("/filters")public Map<String, List<String>> filters(@RequestBody RequestParams params) {return hotelService.filters(params);}
1.5.4、添加 filters 接口
public interface IHotelService extends IService<Hotel> {PageResult search(RequestParams params);Map<String, List<String>> filters(RequestParams params);}
1.5.5、实现接口
这里构建查询请求的时候先经过条件过滤(前端传入参数),然后分别对 品牌、城市、星级聚合.
Ps:这里一定要检查 品牌、星级、城市,构建索引库时的 type 类型是否为 keyword ,也就是不可分词. 否则不可以进行聚合.
@Overridepublic Map<String, List<String>> filters(RequestParams params) {try {//1.构造请求SearchRequest request = new SearchRequest("hotel");//2.准备参数// 1) 查询handlerBoolQueryBuilder(request, params);// 2) 设置 sizerequest.source().size(0);// 3)聚合buildAggregation(request);//3.发送请求,接收响应SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.处理响应Map<String, List<String>> result = new HashMap<>();Aggregations aggregations = response.getAggregations();List<String> brandAgg = getAggListByName(aggregations, "brandAgg");result.put("brand", brandAgg);List<String> cityAgg = getAggListByName(aggregations, "cityAgg");result.put("city", cityAgg);List<String> starAgg = getAggListByName(aggregations, "starAgg");result.put("starName", starAgg);return result;} catch (IOException e) {System.out.println("[HotelService] 酒店数据聚合失败!");e.printStackTrace();return null;}}private List<String> getAggListByName(Aggregations aggregations, String aggName) {Terms terms = aggregations.get(aggName);List<? extends Terms.Bucket> buckets = terms.getBuckets();List<String> brandList = new ArrayList<>();for (Terms.Bucket bucket : buckets) {String key = bucket.getKeyAsString();brandList.add(key);}return brandList;}private void buildAggregation(SearchRequest request) {// 1) 聚合品牌request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(100));// 2) 聚合城市request.source().aggregation(AggregationBuilders.terms("cityAgg").field("city").size(100));//3) 聚合星级request.source().aggregation(AggregationBuilders.terms("starAgg").field("starName").size(100));}
相关文章:
ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合
目录 一、数据聚合 1.1、基本概念 1.1.1、聚合分类 1.1.2、特点 1.2、DSL 实现 Bucket 聚合 1.2.1、Bucket 聚合基础语法 1.2.2、Bucket 聚合结果排序 1.2.3、Bucket 聚合限定范围 1.3、DSL 实现 Metrics 聚合 1.4、基于 JavaRestClient 实现聚合 1.4.1、组装请求 …...
什么是数学建模(mooc笔记)
什么是数学建模 前提:我们数学建模国赛计划选择C题,故希望老师的教学中侧重与C题相关性大的模型及其思想进行培训。之后的学习内容中希望涉及以下知识点: logistic回归相关知识点。如:用法、适用、限制范围等。精学数学建模中常…...
基于SpringBoot的流浪动物管理系
基于SpringBoot的流浪动物管理系的设计与实现,前后端分离 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 后台登陆界面 管理员界面 摘要 基于Spring Boot的…...
fcpx插件:82种复古电影胶卷框架和效果mFilm Matte
无论您是在制作音乐剪辑、私人假期视频还是大型广告活动,这个专业的插件都将帮助您为您的镜头赋予真正的电影角色。 复古效果在任何视频中都能立即识别出来,增添了感伤的复古氛围,并使镜头更具说服力。使用 mFilm Matte 轻松实现这些特征&…...
【LeetCode热题100】--98.验证二叉搜索树
98.验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 由于二…...
wxpython:wx.grid 表格显示 Excel xlsx文件
pip install xlrd xlrd-1.2.0-py2.py3-none-any.whl (103 kB) 摘要: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files pip install wxpython4.2 wxPython-4.2.0-cp37-cp37m-win_amd64.whl (18.0 MB) Successfully installed wxpython-4.…...
事件循环机制
eventLoop 事件循环(Event Loop)是用于管理和调度异步任务执行的一种机制,通常在浏览器中,也在其他 JavaScript 运行环境中存在。事件循环确保 JavaScript 单线程的执行模型下能够处理非阻塞的异步任务,以避免程序阻塞…...
苹果曾考虑基于定位控制AirPods Pro自适应音频
在一次最近的采访中,苹果公司的高管Ron Huang和Eric Treski透露,他们在开发AirPods Pro自适应音频功能时,曾考虑使用GPS信号来控制音频级别。这个有趣的细节打破了我们对AirPods Pro的固有认知,让我们对苹果的创新思维有了更深的…...
【代码阅读笔记】yolov5 rknn模型部署
一、main函数思路 二、值得学习的地方 1、关注yolov5检测流程 2、其中几个重要的结构体 typedef struct {int left;int right;int top;int bottom; } YOLOV5_BOX_RECT; // box坐标信息typedef struct {char name[YOLOV5_NAME_MAX_SIZE];int class_index;YOLOV5_BOX_RECT box…...
【多线程】进程与线程 并发编程 面试题总结
进程和线程 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基…...
C++算法 —— 动态规划(10)二维费用背包
文章目录 1、动规思路简介2、一和零3、盈利计划 背包问题需要读者先明白动态规划是什么,理解动规的思路,并不能给刚接触动规的人学习。所以最好是看了之前的动规博客,以及两个背包博客,或者你本人就已经懂得动规了。 1、动规思路简…...
MySQL数据库正在耗用大量CPU的问题排查
这是一篇实战性的文章,如何处理正在发生的MYSQL服务器CPU飙升的问题,一般情况下,MySQL是不会耗用这么高的CPU的,要么是不走索引的查询,要么是同一时间出现了大量比较耗用资源的查询,不管出现的是哪一种情况…...
php替换字符串里的a变为b
$tempstrstr_replace("\\","/",$tempstr); //把$tempstr中的a替换成b $tempstrstr_replace("a","b",$tempstr);...
黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客
文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二,CSS为何需要它,非常简单HTML只能完成页面的展现,但其做出来的页面奇丑无比。 随着网络的普及,人们的要求更高&…...
NUWA论文阅读
论文链接:NUWA: Visual Synthesis Pre-training for Neural visUal World creAtion 文章目录 摘要引言相关工作视觉自回归模型视觉稀疏自注意 方法3D数据表征3D Nearby Self-Attention3D编码器-解码器训练目标 实验实现细节与SOTA比较T2I微调T2V微调V2V微调Sketch-t…...
4.Tensors For Beginners-Vector Definition
在上一节,已经了解了前向和后向转换。 什么是向量? 定义1:向量是一个数字列表 这很简洁,也通俗易懂。 现有两个向量: 如果要把这两个向量给加起来,只需把对应位置的元素(组件)给加起来。 而要缩放向量&…...
vertx学习总结5
这章我们讲回调,英文名:Beyond callbacks 一、章节覆盖: 回调函数及其限制,如网关/边缘服务示例所示 未来和承诺——链接异步操作的简单模型 响应式扩展——一个更强大的模型,特别适合组合异步事件流 Kotlin协程——…...
Go,从命名开始!Go的关键字和标识符全列表手册和代码示例!
目录 一、Go的关键字列表和分类介绍关键字在Go中的定位语言的基石简洁与高效可扩展性和灵活性 关键字分类声明各种代码元素组合类型的字面表示基本流程控制语法协程和延迟函数调用 二、Go的关键字全代码示例关键字全代码示例 三、Go的标识符定义基础定义特殊规定关键字与标识符…...
【网络】网络扫盲篇 ——用简单语言和图解带你入门网络
网络的一些名词和基础知识讲解 前言正式开始一些基础知识发展背景运营商和生产商 协议协议的分层TCP/IP五层(或四层)模型(可以不看,对新手来说太痛苦了,我这里只是为了让屏幕前的你过一遍就好,里面很多概念新手是不太懂的…...
【项目开发 | C语言项目 | C语言薪资管理系统】
本项目是一个简单的薪资管理系统,旨在为用户提供方便的员工薪资管理功能,如添加、查询、修改、删除员工薪资信息等。系统通过命令行交互界面与用户进行交互,并使用 txt 文件存储员工数据。 一,开发环境需求 操作系统:w…...
Android---GC回收机制与分代回收策略
目录 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾回收算法 JVM 分代回收策略 1. 新生代 2. 老年代 GC Log 分析 引用 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾就是内存中已经没有用的对象,JVM 中的垃圾回收器(Garbage Collector)会自…...
前缀、中缀、后缀表达式相互转换工具
目录 1. 界面一览 2. 使用说明 3. 实例演示 3.1 输入中缀 3.2 输入前缀 3.3 输入后缀 3.4 选择错误的类型 4. 代码 5. 资源地址 关于什么是前缀、中缀、后缀表达式,相信你不知道这个东西,那你也不会点进来这篇博客,当然,…...
Vue之ElementUI之动态树+数据表格+分页(项目功能)
目录 前言 一、实现动态树形菜单 1. 配置相应路径 2. 创建组件 3. 配置组件与路由的关系 index.js 4. 编写动态树形菜单 5. 页面效果演示 二、实现数据表格绑定及分页功能 1. 配置相应路径 2. 编写数据表格显示及分页功能代码 BookList.vue 3. 演示效果 总结 前言…...
【CAD二次开发】给CAD添加TRUSTEDPATHS避免dll插件信任弹窗
找到配置文件目录,遍历下面的每个配置文件; 找到 Variables 下的TRUSTEDPATHS项目;在后面添加新的目录即可,多个目录使用分号分隔; public static void AddPath(string trusedPath){// 指定注册表键的路径...
编译和链接
编译和链接 一:???二:翻译环境1:编译1:预处理2:编译 2:链接 三:运行环境: 本文章所使用的图片均来在yyds鹏哥一:?…...
常识判断 --- 科技常识
目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型...
修改npm全局安装的插件(下载目录指向)
我们先打开终端 然后执行 npm config get prefix查看npm 的下载地址 一般都会在C盘 但是 我们都知道 C盘下东西多了是很不好的 所以 我们可以执行 npm config set prefix “E:\npmfile”将 npm 的下载地址 改变成 E盘下的 npmfile目录 这样 以后 默认全局安装的插件就会都到…...
<C++> 异常
C语言传统的处理错误的方式 传统的错误处理机制: 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的…...
聊聊HttpClientBuilder
序 本文主要研究一下HttpClientBuilder HttpClientBuilder httpclient-4.5.10-sources.jar!/org/apache/http/impl/client/HttpClientBuilder.java public class HttpClientBuilder {public static HttpClientBuilder create() {return new HttpClientBuilder();}protected…...
MacOS - Sonoma更新了啥
1 系统介绍 苹果公司于2023年9月26日发布了macOS Sonoma 14.0正式版。名称由来不知道,可能是地名:Sonoma是一个地名,指加利福尼亚州北部索诺玛县(Sonoma County)。 2 系统重要更新 2.1 将小组件添加到桌面 速览提醒事项和临近日程等。按住Control键点…...
怎样做网站管理/比较好的网络推广平台
这篇文章主要介绍了ThinkPHP在新浪SAE平台的部署的实现方法,以实例的形式详细讲述了WBlog的完整部署过程,需要的朋友可以参考下本文实例讲述了ThinkPHP在新浪SAE平台的部署方法。分享给大家供大家参考。具体实现方法如下:ThinkPHP自从thinkphp3.0版本开始提供了SAE平…...
深圳最好的公司排名/抖音seo排名优化
最近在看java的线程池,对于里面的三种缓存队列里面进行对比学习了下,感觉自己测试下来的结果和网上有些知识点不同相同,所以还希望有人能帮我解惑下。 概述 队列简单解释SynchrousQueue不会保存提交任务,超出直接corePoolSize个…...
佛山网站建设明细/seo技术培训广东
蓝牙(CoreBluetooth)-中心设备(客户端) 蓝牙客户端-中心设备 主要内容 1. 创建中央管理器 2. 发现并且连接外设 3. 寻找连接上的外设数据 4. 发送读或写特征值的请求 5. 订阅外设特征值 1. 创建中心管理器 因为CBCentralManager代表着本地中央设备,所以你必须先创建一个中央管理…...
免费空间访问/seo搜索优化推广
【IT168 专稿】存储是目前IT产业发展的一大热点,而RAID技术是构造高性能、海量存储的基础技术,也是构建网络存储的基础技术。专家认为,磁盘阵列的性能优势得益于磁盘运行的并行性,提高设备运行并行度可以提高磁盘的性能和数据安全…...
番禺网站建设知乎/日本产品和韩国产品哪个好
网上解决办法都是用淘宝镜像,但我先切换了镜像,安装还是慢,最后发现了一个比较快的方案。 打开cmd 先装一个cnpm,指向淘宝npm仓库 npm install -g cnpm --registryhttps://registry.npm.taobao.org再安装vue cli npm install -g…...
网站建设基本流程包括哪几个步骤/seo网络推广优化
网站开发少不了有网站后台,有了后台自然要对用户有同角色来分配一下,特别是多用户系统的情况下,如我一个系统要有多个管理员,那么我这些管理要分成,编辑,友情连接,管理员等,那我们要…...