微服务Day7学习-数据聚合、同步、补全

文章目录

  • 数据聚合
    • 聚合分类
  • 自动补全
    • DSL实现Bucket聚合
    • DSL实现Metrics聚合
    • RestAPI实现聚合
    • 多条件聚合
    • 对接前端接口
    • 拼音分词器
    • 自定义分词器
    • 自动补全查询
    • 实现酒店搜索框自动补全
  • 数据同步
    • 数据同步思路分析
    • 利用mq实现mysql与elasticsearch数据同步
  • 集群
    • 介绍
    • 搭建ES集群

数据聚合

聚合分类

自动补全

在这里插入图片描述
在这里插入图片描述

DSL实现Bucket聚合

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DSL实现Metrics聚合

在这里插入图片描述

RestAPI实现聚合

在这里插入图片描述
测试类

    @Testvoid testAggregation() throws IOException {//1.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSL//2.1 设置sizerequest.source().size(0);//2.2 聚合request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(20));//3.发出请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析结果System.out.println(response);}

在这里插入图片描述

    @Testvoid testAggregation() throws IOException {//1.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSL//2.1 设置sizerequest.source().size(0);//2.2 聚合request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(20));//3.发出请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析结果Aggregations aggregations = response.getAggregations();//4.1 根据聚合名称获取聚合结果Terms brandTerms = aggregations.get("brandAgg");//4.2 获取bucketsList<? extends Terms.Bucket> buckets = brandTerms.getBuckets();//4.3 遍历for (Terms.Bucket bucket : buckets) {//4.4获取keyString key = bucket.getKeyAsString();System.out.println(key);}}

多条件聚合

在这里插入图片描述
Service实现类中

    @Overridepublic Map<String, List<String>> filters() {//1.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSL//2.1 设置sizerequest.source().size(0);//2.2 聚合buildAggregation(request);//3.发出请求SearchResponse response = null;try {response = client.search(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}//4.解析结果Map<String, List<String>> result = new HashMap<>();Aggregations aggregations = response.getAggregations();//4.1 根据名称获取品牌结果 并放入mapList<String> brandList = getAggByName(aggregations,"brandAgg");result.put("品牌", brandList);List<String> cityList = getAggByName(aggregations,"cityAgg");result.put("城市", cityList);List<String> starList = getAggByName(aggregations,"starAgg");result.put("星级", starList);return result;}private List<String> getAggByName(Aggregations aggregations,String aggName) {//4.1 根据聚合名称获取聚合结果Terms brandTerms = aggregations.get(aggName);//4.2 获取bucketsList<? extends Terms.Bucket> buckets = brandTerms.getBuckets();//4.3 遍历List<String> brandList = new ArrayList<>();for (Terms.Bucket bucket : buckets) {//4.4获取keyString key = bucket.getKeyAsString();brandList.add(key);}return brandList;}private void buildAggregation(SearchRequest request) {request.source().aggregation(AggregationBuilders.terms("brandAgg").field("brand").size(100));request.source().aggregation(AggregationBuilders.terms("cityAgg").field("city").size(100));request.source().aggregation(AggregationBuilders.terms("starAgg").field("starName").size(100));}

对接前端接口

在这里插入图片描述

拼音分词器

在这里插入图片描述
在这里插入图片描述

自定义分词器

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动补全查询

在这里插入图片描述
在这里插入图片描述

实现酒店搜索框自动补全

在这里插入图片描述
DSK代码

DELETE /hotel
# 酒店数据索引库
PUT /hotel
{"settings": {"analysis": {"analyzer": {"text_anlyzer": {"tokenizer": "ik_max_word","filter": "py"},"completion_analyzer": {"tokenizer": "keyword","filter": "py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"id":{"type": "keyword"},"name":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart", "copy_to": "all"},"address":{"type": "keyword","index": false},"price":{"type": "integer"},"score":{"type": "integer"},"brand":{"type": "keyword","copy_to": "all"},"city":{"type": "keyword"},"starName":{"type": "keyword"},"business":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "text_anlyzer","search_analyzer": "ik_smart"},"suggestion":{"type": "completion","analyzer": "completion_analyzer"}}}
}GET /hotel/_search
{"query": {"match_all": {}}
}GET /hotel/_search
{"suggest": {"suggestions": {"text": "","completion": {"field": "suggestion","skip_duplicates": true,"size": 10}}}
}

修改实体类

@Data
@NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;private Object distance;private Boolean isAD;private List<String> suggestion;public HotelDoc(Hotel hotel) {this.id = hotel.getId();this.name = hotel.getName();this.address = hotel.getAddress();this.price = hotel.getPrice();this.score = hotel.getScore();this.brand = hotel.getBrand();this.city = hotel.getCity();this.starName = hotel.getStarName();this.business = hotel.getBusiness();this.location = hotel.getLatitude() + ", " + hotel.getLongitude();this.pic = hotel.getPic();if (this.business.contains("/")){//business有多个点,需要切割String[] arr = this.business.split("/");//添加元素this.suggestion = new ArrayList<>();this.suggestion.add(this.brand);Collections.addAll(this.suggestion, arr);}else {this.suggestion = Arrays.asList(this.brand,this.business);}}
}

在这里插入图片描述
建立测试类

    @Testvoid testSuggest() throws IOException {//1.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSLrequest.source().suggest(new SuggestBuilder().addSuggestion("suggestions", SuggestBuilders.completionSuggestion("suggestion").prefix("h").skipDuplicates(true).size(10)));//3.发起请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);///4.解析结果System.out.println(response);}

在这里插入图片描述
测试类

    @Testvoid testSuggest() throws IOException {//1.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSLrequest.source().suggest(new SuggestBuilder().addSuggestion("suggestions", SuggestBuilders.completionSuggestion("suggestion").prefix("h").skipDuplicates(true).size(10)));//3.发起请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);///4.解析结果Suggest suggest = response.getSuggest();//4.1根据补全查询名称获取补全结果CompletionSuggestion suggestions = suggest.getSuggestion("suggestions");//4.2 获取optionsList<CompletionSuggestion.Entry.Option> options = suggestions.getOptions();//4.3 遍历for (CompletionSuggestion.Entry.Option option : options) {String text = option.getText().toString();System.out.println(text);}}

在这里插入图片描述

    @Overridepublic List<String> getSuggestions(String prefix) {//1.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSLrequest.source().suggest(new SuggestBuilder().addSuggestion("suggestions", SuggestBuilders.completionSuggestion("suggestion").prefix(prefix).skipDuplicates(true).size(10)));//3.发起请求SearchResponse response = null;try {response = client.search(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}///4.解析结果Suggest suggest = response.getSuggest();//4.1根据补全查询名称获取补全结果CompletionSuggestion suggestions = suggest.getSuggestion("suggestions");//4.2 获取optionsList<CompletionSuggestion.Entry.Option> options = suggestions.getOptions();//4.3 遍历List<String> list = new ArrayList<>(options.size());for (CompletionSuggestion.Entry.Option option : options) {String text = option.getText().toString();list.add(text);}return list;}

数据同步

数据同步思路分析

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

利用mq实现mysql与elasticsearch数据同步



声明excahnge、queue、RoutingKey

public class MqConstants {//交换机public final  static String HOTEL_EXCHANGE = "hotel.topic";//新增修改的队列public final  static String HOTEL_INSERT_QUEUE = "hotel.insert.queue";//删除队列public final  static String HOTEL_DELETE_QUEUE = "hotel.delete.queue";//新增获修改RoutingKeypublic final  static String HOTEL_INSERT_KEY = "hotel.insert";//删除的RoutingKeypublic final  static String HOTEL_DELETE_KEY = "hotel.delete";
}
@Configuration
public class MqConfig {@Beanpublic TopicExchange topicExchange(){return new TopicExchange(MqConstants.HOTEL_EXCHANGE,true,false);}@Beanpublic Queue insertQueue(){return new Queue(MqConstants.HOTEL_INSERT_QUEUE,true);}@Beanpublic Queue deleteQueue(){return new Queue(MqConstants.HOTEL_DELETE_QUEUE,true);}@Beanpublic Binding insertQueueBinding(){return BindingBuilder.bind(insertQueue()).to(topicExchange()).with(MqConstants.HOTEL_INSERT_KEY);}@Beanpublic Binding deleteQueueBinding(){return BindingBuilder.bind(deleteQueue()).to(topicExchange()).with(MqConstants.HOTEL_DELETE_KEY);}
}

yaml配置

  rabbitmq:host: xxx.xxx.x.xxx(主机地址)port: 5672username: itcastpassword: 123321virtual-host: /

在hotel-admin中增、删、改业务中完成消息发送
mq组件

@Component
public class HotelListener {@Autowiredprivate IHotelService hotelService;/*** 监听酒店新增或修改的业务* @param id*/@RabbitListener(queues = MqConstants.HOTEL_INSERT_QUEUE)public void listenHotelInsertOrUpdate(Long id){hotelService.insertById(id);}/*** 监听酒店删除的业务* @param id*/@RabbitListener(queues = MqConstants.HOTEL_DELETE_QUEUE)public void listenHotelDelete(Long id){hotelService.deleteById(id);}
}

实现类

    @Autowiredprivate RabbitTemplate rabbitTemplate;@PostMappingpublic void saveHotel(@RequestBody Hotel hotel){hotelService.save(hotel);rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE, MqConstants.HOTEL_INSERT_KEY, hotel.getId());}@PutMapping()public void updateById(@RequestBody Hotel hotel){if (hotel.getId() == null) {throw new InvalidParameterException("id不能为空");}hotelService.updateById(hotel);rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE, MqConstants.HOTEL_INSERT_KEY, hotel.getId());}@DeleteMapping("/{id}")public void deleteById(@PathVariable("id") Long id) {hotelService.removeById(id);rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE, MqConstants.HOTEL_DELETE_KEY, id);}

在hotel-demo中完成消息监听,并更新elasticsearch中的数据

    @Overridepublic void deleteById(Long id) {//1.准备RequestDeleteRequest request = new DeleteRequest("hotel",id.toString());//2.准备发送请求try {client.delete(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}}@Overridepublic void insertById(Long id) {//0.根据id查询酒店数据Hotel hotel = getById(id);//转换文档类型HotelDoc hotelDoc = new HotelDoc(hotel);//1.准备RequestIndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2.准备JSON文档request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);//3.准备发送请求try {client.index(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}}

集群

介绍

在这里插入图片描述

搭建ES集群

version: '2.2'
services:es01:image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1container_name: es01environment:- node.name=es01- cluster.name=es-docker-cluster- discovery.seed_hosts=es02,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- data01:/usr/share/elasticsearch/dataports:- 9200:9200networks:- elastices02:image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1container_name: es02environment:- node.name=es02- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- data02:/usr/share/elasticsearch/datanetworks:- elastices03:image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1container_name: es03environment:- node.name=es03- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es02- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"ulimits:memlock:soft: -1hard: -1volumes:- data03:/usr/share/elasticsearch/datanetworks:- elasticvolumes:data01:driver: localdata02:driver: localdata03:driver: localnetworks:elastic:driver: bridge

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Electron qt开发教程

模块安装打包 npm install -g electron-forge electron-forge init my-project --templatevue npm start //进入目录启动 //打包成一个目录到out目录下&#xff0c;注意这种打包一般用于调试&#xff0c;并不是用于分发 npm run package //打出真正的分发包&#xff0c;放在o…

HarmonyOS未来五年的市场展望

一、引言 随着科技的不断进步和消费者对于智能化设备需求的日益增长&#xff0c;操作系统作为连接硬件与软件的核心平台&#xff0c;其重要性愈发凸显。HarmonyOS&#xff08;鸿蒙系统&#xff09;&#xff0c;作为华为自主研发的分布式操作系统&#xff0c;自诞生以来便备受瞩…

华安保险:核心系统分布式升级,提升保费规模处理能力2-3倍 | OceanBase企业案例

在3月20日的2024 OceanBase数据库城市行的活动中&#xff0c;安保险信息科技部总经理王在平发表了以“保险行业核心业务系统分布式架构实践”为主题的演讲。本文为该演讲的精彩回顾。 早在2019年&#xff0c;华安保险便开始与OceanBase接触&#xff0c;并着手进行数据库的升级…

使用本地大模型调用代码,根本就是一场骗局!

通过大模型调用其他工具到底可不可行&#xff1f;ChatGPT 或许能轻松搞定一切&#xff0c;但同样的需求落在本地大模型上&#xff0c;恐怕就要打个问号了。 法国开发工程师 Emilien Lancelot 尝试了多款号称具备工具调用功能的 agent 框架&#xff0c;来看看本地大模型到底能不…

qt-C++笔记之命令行生成项目pro文件(极简编译qt项目代码)

qt-C笔记之命令行生成项目pro文件(极简编译qt项目代码) 文章目录 qt-C笔记之命令行生成项目pro文件(极简编译qt项目代码)步骤 1&#xff1a;生成项目文件步骤 2&#xff1a;生成 Makefile 文件步骤 3&#xff1a;编译程序详细解释注意事项项目结构main.cpp 文件生成项目文件生成…

服饰进口清关流程及注意事项 | 国际贸易数字化平台 | 箱讯科技

随着全球化进程的不断推进&#xff0c;我国消费者对国外品牌服饰的需求日益增长&#xff0c;衣服进口业务也随之蓬勃发展。作为一名从事进口衣服行业的专业人士&#xff0c;掌握清关流程及注意事项至关重要。本文将为您详细解析衣服进口清关流程&#xff0c;并提供一些实用建议…

SpringSecurity入门(二)

8、获取用户认证信息 三种策略模式&#xff0c;调整通过修改VM options // 如果没有设置自定义的策略&#xff0c;就采用MODE_THREADLOCAL模式 public static final String MODE_THREADLOCAL "MODE_THREADLOCAL"; // 采用InheritableThreadLocal&#xff0c;它是Th…

图形和插图软件Canvas X Pro 20 Build 914

Canvas X Pro是一款功能强大、用途广泛的Windows软件,旨在处理技术图形和可视化,该程序结合了创建矢量和光栅图形的工具,这使其成为需要创建高质量技术插图和演示文稿的工程师、设计师、科学家和其他专业人士的理想选择。 Canvas X Pro的主要功能之一是支持处理大型和复杂的…

tcp协议的延迟应答(介绍+原则),拥塞控制(拥塞窗口,网络出现拥塞时,滑动窗口的大小如何确定,慢启动,阈值)

目录 延迟应答 引入 介绍 原则 拥塞控制 引入 网络出现拥塞 引入 介绍 介绍 拥塞窗口 介绍 决定滑动窗口的大小 慢启动 介绍 为什么要有慢启动 阈值 算法 总结 延迟应答 引入 发送方一次发送更多的数据,发送效率就越高 因为要写入网卡硬件的io速度很慢,尽量…

笔记 | 软件工程06-2:软件设计-软件体系结构设计

1 软件体系结构的概念 1.1 软件体系结构的设计元素 1.2 不同的抽象层次 1.3 软件体系结构的不同视图 1.3.1 软件体系结构的逻辑视图&#xff1a;包图 1.3.2 软件体系结构的逻辑视图&#xff1a;构件图 1.3.3 软件体系结构的开发视图 1.3.4 软件体系结构的部署视图 1.3.4.1 描述…

02眼电识别眼动--软件V1.0

对应视频链接点击直达 01项目点击下载&#xff0c;可直接运行&#xff08;含数据库&#xff09; 02眼电识别眼动--软件V1.0 对应视频链接点击直达构思结语其他以下是废话 构思 对于软件&#xff0c;主要就是接收数据、处理数据、储存和显示数据。 这是主要页面&#xff0c;…

【第2章】Vue快速上手

文章目录 前言一、第一个Vue程序二、Open in Browser插件1.安装2. 使用3. 界面 总结 前言 这里我们来实现我们的第一个程序。 一、第一个Vue程序 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&quo…

java版UWB高精度实时定位系统源码springboot+vue

UWB人员定位系统&#xff0c;实现人员的自动识别、位置定位、区域报警等功能。该系统能高效记录人员信息&#xff0c;出入信息及位置信息&#xff0c;并能灵活的查询及管理历史轨迹&#xff0c;可极大提高信息安全度&#xff0c;有效弥补了视频监控的不足。使人员管理实现信息化…

【端午惊喜】2024年6月6日 docker 国内镜像源集体失效

文章目录 概述中科大镜像源阿里镜像源其他镜像源可用的镜像源写在最后 概述 大家都知道使用docker hub官方镜像需要魔法&#xff0c;虽然大部人有魔法&#xff0c;但是网速也是很慢&#xff0c;还有部分同学没有&#xff0c;全靠国内各大厂商的镜像源&#xff0c;可是端午6.6大…

一个公用的数据状态修改组件

灵感来自于一项重复的工作&#xff0c;下图中&#xff0c;这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是&#xff0c;基于该组件类捕获组件跳转写了这款通用接口。省时省力。 代码如下&#xff1a;…

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时&#xff0c;若发现程序运行时间越长&#xff0c;占用内存越大直至崩溃&#xff0c;通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因&#xff0c;包括数组和字符串处理、未释放的资源、循环中的对象创建等&#xff0c;并提供具体的解决方…

【ARM Coresight Debug 系列 -- ARMv8/v9 软件实现断点地址设置】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v8 软件设置段带你断点地址软件配置流程代码实现 ARMv8/v8 软件设置段带你 在ARMv8/9架构中&#xff0c;可以通过寄存器 DBGBVR0_EL1 设置断点。这个寄存器是一系列调试断点值寄存器中的第一个DBGBVRn_EL1&#xff0c;其中n…

http接口上传文件响应413:413 Request Entity Too Large

目录 一、场景简介二、异常展示三、原因四、解决 一、场景简介 1、服务端有经过nginx代理 2、上传文件超过5M时&#xff0c;响应码为413 3、上传文件小于5M时&#xff0c;上传正常 二、异常展示 三、原因 nginx限制了上传数据的大小 四、解决 扩大nginx上传数据的大小 步…

大模型生成短视频

最近看到一个开源项目可以通过AI生成短视频&#xff0c;然后尝试了下&#xff0c;感觉还不错&#xff0c;下面是具体步骤。 项目名叫moneyprinterTurbo&#xff0c;它本意是对接到Youtube&#xff0c;自动生成视频并上传到Youtube获取流量赚钱&#xff0c;所以项目名叫moneypri…

CISP究竟适合谁?这四类人没跑了

在信息技术飞速发展的现在&#xff0c;网络安全已经成为了一个不可忽视的话题。 CISP&#xff0c;即注册信息安全专业人员&#xff0c;是网络安全领域内一项备受认可的专业认证。 但CISP究竟适合谁考呢&#xff1f;这不仅是一个技术问题&#xff0c;更是一个职业规划的问题。…