# yusou
**Repository Path**: fireLh/yusou
## Basic Information
- **Project Name**: yusou
- **Description**: 一个集合搜索平台
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-04-28
- **Last Updated**: 2023-05-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# yusou
项目演示地址:https://www.bilibili.com/video/BV1dc411T7KG/?vd_source=c40a53f7346eeb69aad3dee1ac8a9eb4
## 简介
为您提供一个聚合搜索平台,您可以在一个页面上搜索出来不同类型的内容(如:文章,人物,图片)
## 技术说明
### 后端
- Spring Boot 2.7.2
- MyBatis + MyBatis Plus 数据访问
- Spring AOP 切面编程
- Spring Scheduler 定时任务
- MySQL 数据库
- Elasticsearch 搜索引擎
- Hutool 工具库
……
### 前端
Vue
## 功能说明
### 浏览👁
为了方便您理解,咱来先看看页面,以下页面即您打开网站所看到的

#### 文章
文章的话,我是爬的其它网站的内容,自己咋可能写这么多,至于咋爬的留给面试官问俺

#### 图片
图片也算是利用了爬虫的技术了~,咋爬的您问我哈~

### 搜索🔍
接下来演示一下通过搜索出来的页面


用户页面我就不显示了,也没有叫Java的用户,至于单拎出来说他,是因为我用到了Elasticsearch技术来实现搜索的功能,我觉得它真的很强大!
## 亮点⭐
你:一圈看下来,好像除了Elasticsearch也没有什么亮眼的技术呀!
我:表面上看是的,是没有什么亮眼的技术,但是在后端实现上我花了大的功夫!
1. 门面模式
既然是聚合搜索平台,那么前端得发送不同的请求来分别获取不同的Controller层的数据嘛?
用大拇指想一下,肯定是不可以的,那么我们就可以建立一个门面,使得前端只调用一个接口便可以实现该功能(门面模式)

就是通过一个接口搜索出来不同的内容,哇哦高大尚的感觉
2. 适配器模式
或许您会想,哈哈哈,那简单就是调用不同service层的服务即可呀,然后前端传来type,后端通过type在switch控制下来获取相关的数据即可呀!
确实可行,但是如果你要接入其它内容呢?而这些内容样式很多,比如说,视频,音乐,新闻……等,这些你都要一个一个的添加service层,然后加到switch嘛?
我觉得如果您这么做了,面试官看到,心道:原来还是个菜趴呀~
首先您这么做存在两个问题:
1. 类型过多,内容繁杂,没有统一的行为规范!
2. switch语句不够优雅!
解决方案:
1. 那么我们就得先规定统一的接口来规范每一个“类型”的行为;
2. 干掉switch,实现一个注册器,将用到的类型的service实例放到里面,用到什么取什么即可!
3. 注册器模式:即我上面提到的注册器啦~
4. Spring Scheduler 定时任务
既然使用Elasticsearch来获取数据,那么和Redis一样,肯定牵扯到了数据一致性问题,比如说我修改了数据库,但是我的Elasticsearch中的数据还是旧的,您忍心让咱可爱的用户看旧的数据嘛?
不忍心!ok,干他!
解决方法:开启定时任务,每隔1分钟查询一次,近5分钟内修改/添加过的数据,然后同步到Elasticsearch上去