微服务学习|elasticsearch:数据聚合、自动补全、数据同步

news2024/11/18 5:39:58

数据聚合

聚合的分类

聚合 (aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

桶(Bucket)聚合:用来对文档做分组
TermAggregation:按照文档字段值分组
Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

度量(Metric)聚合:用以计算一些值,比如: 最大值、最小值、平均值等Avg:求平均值Max:求最大值Min:求最小值Stats:同时求max、min、avg、sum等
管道(pipeline)聚合: 其它聚合的结果为基础做聚合

参与聚合的字段类型必须是:keyword、数值、日期、布尔

DSL实现Bucket聚合

现在,我们要统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合。类型为term类型,DSL示例

查询结果,在buckets中,返回了所有酒店品牌和该品牌酒店的数量

Bucket聚合-聚合结果排序

默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照 count降序排序。我们可以修改结果排序方式

可以看到,查询出的聚合结果,品牌按照其酒店数量由少到多排列

Bucket聚合-限定聚合范围

默认情况下,Bucket聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可

价格在200以下的酒店品牌只有三家

DSL实现Metrics聚合

例如,我们要求获取每个品牌的用户评分的min、max、avg等值我们可以利用stats聚合

可以看到,对分数score增加过stats聚合后,聚合结果增加了每个品牌的分数的最小值、最大值等

RestAPI实现聚合

我们以品牌聚合为例,演示下Java的RestClient使用,先看请求组装

编写一个测试类

再看下聚合结果解析

在测试类中编写解析代码

多条件聚合

案例:在IUserService中定义方法,实现对品牌、城市、星级的聚合

需求:搜索页面的品牌、城市等信息不应该是在页面写死,而是通过聚合索引库中的酒店数据得来的

在IUserService中定义一个方法,实现对品牌、城市、星级的聚合,方法声明如下

实现类中编写具体的业务方法

将选中部分代码抽取出来成为一个单独的方法

然后发请求,解析结果

把解析结果这部分的代码抽取出来,因为后面要对品牌brandAgg、城市cityAgg、星级starAgg的聚合结果都解析一下,抽取方便调用,代码简化

抽取之后,对品牌brandAgg、城市cityAgg、星级starAgg的聚合结果都调用该方法解析出来,然后存到Map中,最终返回即可

编写测试类调用该服务

结果显示如下

带过滤条件的聚合

对接前端接口

前端页面会向服务端发起请求,查询品牌、城市、星级等字段的聚合结果:
可以看到请求参数与之前search时的RequestParam完全-致,这是在限定聚合时的文档范围。
例如:用户搜索“外滩”,价格在300~600,那聚合必须是在这个搜索条件基础上完成。
因此我们需要:
1.编写controller接口,接收该请求
2.修改IUserService#getFilters()方法,添加RequestParam参数
修改getFilters方法的业务,聚合时添加query条件

参数与查询时的参数一致(参考上一篇文章的最后案例)上一篇文章最后的案例1

业务接口定义方法

服务实现类中的方法增加对参数的封装,查询的限定,用的这个方法也和之前查询时的封装方法一样上一篇文章最后的案例1

什么都不限定,返回的聚合信息这么多

限定一个价格区间,发现返回的聚合信息变少了

自动补全

当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图

使用拼音分词

要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。

安装方式与IK分词器一样,分三步:
1.解压
2.上传到虚拟机中,elasticsearch的plugin目录
3.重启elasticsearch
4.测试

1.解压

2.上传到虚拟机中,elasticsearch的plugin目录

3.重启elasticsearch

4.测试

对每个汉字分出单独的拼音词条,并且还有拼音简写

自定义分词器

elasticsearch中分词器 (analyzer) 的组成包含三部分:
character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
tokenizer: 将文本按照一定的规则切成词条 (term)。例如keyword,就是不分词;还有ik_smart

tokenizer filter: 将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

我们可以在创建索引库时,通过settings来配置自定义的analyzer (分词器)

测试

创建索引库

可以看到完成了自定义的分词器设置

往索引库中新增2条文档,狮子和虱子,然后进行检索查询,shizi,发现查询结果两个文档都查询了出来

但是,当查的匹配信息是调入狮子笼咋办,狮子肯定和虱子没关系,但是因为该name字段的分词器的缘故,虱子也被匹配上了因为拼音一致

拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用

因此字段在创建倒排索引时应该用my analyzer分词器;字段在搜索时应该使用ik smart分词器

在创建索引库时,用上述方法创建,然后再次查询,发现虱子没被匹配上了

completion suggester查询

elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:
参与补全查询的字段必须是completion类型
字段的内容一般是用来补全的多个词条形成的数组。

查询语法如下

测试

案例:实现hotel索引库的自动补全、拼音搜索功能

实现思路如下:
1.修改hotel索引库结构,设置自定义拼音分词器
2.修改索引库的name、all字段,使用自定义分词器
3.索引库添加一个新字段suggestion,类型为completion类型,使用自定义的分词器

4.给HotelDoc类添加suggestion字段,内容包含brand、business
5.重新导入数据到hotel库

1.修改hotel索引库结构,设置自定义拼音分词器

2.修改索引库的name、all字段,使用自定义分词器

3.索引库添加一个新字段suggestion,类型为completion类型,使用自定义的分词器

4.给HotelDoc类添加suggestion字段,内容包含brand、business

再次运行之前的批量从数据库中将数据插入es中的方法

再次查询索引库,发现suggestion字段已经由品牌和商圈填充,是数组格式,但是有的商圈是两个,需要将这两个也分开

故修改hotelDoc类中有参构造器中的代码

重新运行该方法后,再次查询,发现该商圈信息也已经分开

然后用Completion Suggester查询语法来实现自动补全功能,查“sd”,查出了suggestion中含有“上地产业园”的文档

RestAPI实现自动补全

先看请求参数构造的API

编写测试类

再来看结果解析

增加测试类中的解析结果

案例:实现酒店搜索页面输入框的自动补全

查看前端页面,可以发现当我们在输入框键入时,前端会发起ajax请求

在服务端编写接口,接收该请求,返回补全结果的集合,类型为List<String>

服务层生成对应方法

业务层具体代码

try catch 一下

实现功能

数据同步

数据同步问题分析

elasticsearch中的酒店数据来自于mysql数据库,因此mysq[数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步

在微服务中,负责酒店管理(操作mysql)的业务与负责酒店搜索(操作elasticsearch )的业务可能在两个不同的微服务上数据同步该如何实现呢?

方案一:同步调用

优点:实现简单,粗暴
缺点:业务耦合度高

方案二:异步通知

优点:低耦合,实现难度一般
缺点:依赖mq的可靠性

方案三:监听binlog

优点:完全解除服务间耦合
缺点:开启binlog增加数据库负担、实现复杂度高

案例:利用MQ实现mysql与elasticsearch数据同步

利用课前资料提供的hotel-admin项目作为酒店管理的微服务。当酒店数据发生增、删、改时,要求对elasticsearch中数据也要完成相同操作
步骤:
导入课前资料提供的hotel-admin项目,启动并测试酒店数据的CRUD
声明exchange、queue、RoutingKey
在hotel-admin中的增、删、改业务中完成消息发送
在hotel-demo中完成消息监听,并更新elasticsearch中数据
启动并测试数据同步功能

启动hotel-admin项目

在es的微服务hotel-demo中引入rabbitmq依赖

yaml配置文件配置mq相关配置

定义一个常量类,设置队列名字,交换机名字,包括key

创建一个配置类,声明交换机、队列,以及绑定关系

在hotel-admin项目中引入mq的依赖

在其项目的yaml文件中配置mq的配置

在对酒店信息进行crud操作的controller中引入对mq发消息的类rabbitTemplate

在新增酒店信息和更新酒店信息的方法中,插入和更新信息到数据库中后,要对队列发送一个消息,并且key是酒店插入的key,代表消息发送至插入酒店信息的队列中,将这个插入酒店的id传上去

在删除酒店信息的方法中,信息从数据库中删除后,要对队列发送一个消息,并且key是酒店删除的key,代表消息发送至删除酒店信息的队列中,将这个删除酒店的id传上去

在对es操作的hotel-demo项目中编写队列监听类,分别监听两个队列,并执行相关的业务操作

服务层增加这两个业务操作,在es中增加酒店信息方法和删除酒店信息方法

增加酒店信息具体的业务方法

删除酒店具体的业务方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1303010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动能资讯 | 智慧汽车—城市NOA迎爆发

在特斯拉引领的 TransformerBev 架构驱动下&#xff0c;智驾算法趋近于端到端的智驾大模型&#xff0c;使得智能驾驶开始步入城市 NOA 新时代。 消费者认知增强&#xff0c;未来市场空间广阔。伴随城市 NOA 在 23-24 年的落地和普及、L3 法规在年内的落地&#xff0c;行业 0-1…

Java-异常(一)-异常的概述和常见异常的举例

&#x1f436;b站视频 124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 目录 b站视频 5.1 异常概念 5.2 Error 示例代码 5.3 Exception异常划分 ❓面试题&#xff1a;常见的异常有哪些&#xff1f;举例说明 &#x1f436;5.1 异常概念 在使用计算机语言进行…

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用&#xff0c;只需要简单的几十行代码&#xff0c;就可以实现如下手写功能以及清空画布功能。 一、先上效果图&#xff1a; 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

HCIA-H12-811题目解析(10)

1、【单选题】DHCP客户端在租期到达哪个比例时第一次发送续租报文&#xff1f; 2、【单选题】在WLAN中用于标识无线网络&#xff0c; 区分不同的无线网络的是&#xff1f; 3、【单选题】我们在笔记本电脑上搜索可接入无线网络时&#xff0c;显示出来的网络名称实际是 4、【单…

leetcode 904. 水果成篮(优质解法)

代码&#xff1a; class Solution {public int totalFruit(int[] fruits) {int lengthfruits.length;int []fruitNumsnew int[length1]; //用于记录各个种类摘了多少个水果int count0; //用于记录当前采摘了几种水果int sum0; //用于记录当前共摘了多少水果for(int left0…

mmseg上手自己的数据集

制作自己的数据集&#xff0c;VOC格式为例。 这三个文件包括数据集的名称。可以使用labelme脚本自动生成。 跟据预测类别修改配置文件 D:\projects\mmsegmentation-main\mmseg\datasets\voc.py 因为是voc格式的数据集&#xff0c;在这个文件里进行配置&#xff0c;修改成自己数…

at least 1 bean which qualifies as autowire candidate

No qualifying bean of type com. spdbcccdl.mapper.dl.DatabaseDaoavailable: expected at least 1 bean which qualifies as autowire candidate.

《PySpark大数据分析实战》-02.了解Hadoop

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

PC 机与单片机通信(RS232 协议)

PC 机与单片机通信(RS232 协议) 目录&#xff1a; 1、单片机串口通信的应用 2、PC控制单片机IO口输出 3、单片机控制实训指导及综合应用实例 4、单片机给计算机发送数据&#xff1a; [实验任务] 单片机串口通信的应用&#xff0c;通过串口&#xff0c;我们的个人电脑和单…

智能优化算法应用:基于阴阳对算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阴阳对算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阴阳对算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阴阳对算法4.实验参数设定5.算法结果6.参考文…

搜集怎么绘制三维曲线和曲面?

1、针对函数对象是单一变量、两个函数的情况。用plot3函数&#xff1b;&#xff08;三维曲线&#xff09; 看一下matlab官方的例子&#xff1a; t 0:pi/50:10*pi; st sin(t); ct cos(t); plot3(st,ct,t) 绘制出来的曲线&#xff1a; 几个比较关键的点&#xff1a; &…

手把手教你玩转ESP8266(原理+驱动)

在嵌入式开发中&#xff0c;无线通信的方式有很多&#xff0c;其中 WIFI 是绕不开的话题。说到 WIFI 通信&#xff0c;就不得不提 ESP8266了。 ESP8266 是一款高性能的 WIFI 串口模块&#xff0c;实现透明传输。只要有一定的串口知识&#xff0c;不需要知道 WIFI 原理就可以上…

数据结构:第13关:查找两个单词链表共同后缀的起始结点

任务描述编程要求 输入输出测试说明来源 任务描述 本关任务&#xff1a;假定采用带头结点的单链表保存单词&#xff0c;当两个单词有相同的后缀时&#xff0c;则可共享相同的后缀空间。 例如&#xff0c;“loading”和“being”的存储映像如下图所示&#xff1a; 设str1和str2…

论文阅读《Domain Generalized Stereo Matching via Hierarchical Visual Transformation》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Chang_Domain_Generalized_Stereo_Matching_via_Hierarchical_Visual_Transformation_CVPR_2023_paper.html 概述 立体匹配模型是近年来的研究热点。但是&#xff0c;现有的方法过分依赖特定数据集上…

使用 PyTorch FSDP 微调 Llama 2 70B

通过本文&#xff0c;你将了解如何使用 PyTorch FSDP 及相关最佳实践微调 Llama 2 70B。在此过程中&#xff0c;我们主要会用到 Hugging Face Transformers、Accelerate 和 TRL 库。我们还将展示如何在 SLURM 中使用 Accelerate。 完全分片数据并行 (Fully Sharded Data Paral…

游戏中小地图的制作__unity基础开发教程

小地图的制作 Icon标识制作制作摄像机映射创建地图UI效果“不一样的效果” 在游戏中经常可以看到地图视角的存在&#xff0c;那么地图视角是如何让实现的呢&#xff1f; 这一期教大家制作一个简易的小地图。 &#x1f496;点关注&#xff0c;不迷路。 老样子&#xff0c;我们还…

使用MfgTool烧写前需准备的文件

一. 简介 本文我们就来学习&#xff0c;如何将我们编译的 uboot&#xff0c;zImage&#xff08;内核镜像&#xff09;&#xff0c;xxx.dtb设备树文件&#xff0c;还有制作的根文件系统&#xff0c;这四个文件烧写到开发板中&#xff0c;最后 开发板能正常启动。 本文这里使用…

Linux实用操作篇-下篇

Linux实用操作篇-上篇&#xff1a;Linux实用操作-上篇-CSDN博客 一、网络传输 1.1 ping命令 网络是否可联通 可以通过ping命令&#xff0c;检查指定的网络服务器是否是可联通状态 语法: ping [-c num] ip或主机名 选项&#xff1a;-c&#xff0c;检查的次数&#xff0c;…

# 一些视觉-激光、加速度传感器类的铣削振动测试方法案例

一些视觉-激光类的铣削振动测试方法 1. 基于激光测振仪的振动测试2. 切削加工的 加速度传感器实测信号2.1 x轴向信号2.2 Y轴向信号2.3 第二次廊坊实验3. 关于数值频域积分1. 基于激光测振仪的振动测试 【1】舜宇LDV|激光测振—机床铣刀寿命预测 新刀具为100hz主频 旧刀具为800…

多源异构数据融合是什么,在进行故障预测、诊断、辨识的时候有什么有优点和缺点!

文章目录 1、多源异构数据融合是什么2、多源异构数据融合的优点主要包括&#xff1a;3、多源异构数据融合进行故障辨识的缺点 1、多源异构数据融合是什么 多源异构数据融合是将来自于不同设备、传感器、系统或网络等多个数据源的数据进行整合并综合分析处理的一种技术。这种数…