# springboot数据同步Mysql-ElasticSearch
**Repository Path**: black_luk/spring-boot-data-syn
## Basic Information
- **Project Name**: springboot数据同步Mysql-ElasticSearch
- **Description**: 搜索高德地图地点信息,记录入数据库,并将信息同步至ES用于查询
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2023-04-19
- **Last Updated**: 2023-04-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# springboot数据同步Mysql-ElasticSearch
### 介绍
搜索高德地图地点信息,记录入数据库,并将信息同步至ES用于模糊查询
项目中所用到技术下文都有详细讲解,还提供了软件的安装地址及配置教程,非常适合像我一样的新手
### 软件结构
非常简单的软件架构如下图:

1. 首先在spring boot项目中,通过定时任务(或者controller接口),使用HTTP抓取高德地图poi(point of interest,你感兴趣的)数据,并将抓取到的数据存入MySQL数据库。
2. 数据存入MySQL后,使用canal监听MySQL的binlog,然后再在spring boot项目中额外启动一个canal客户端线程,用于拉去canal中的数据。
可能有同学会疑问,为什么你都有数据了,直接再写入elasticsearch中不就好吗? 其实这也是一种方法,名为双写。但在生产环境中,可能会有很多个地方触发入库的操作,
若是一不小心有一个地方只写入mysql库,忘记写入es,会造成数据不一致。此外,这个canal客户端还可以部署在其他的实例上,或者直接发送到kafka,供其他系统同步。
3. canal客户端获取到数据后,根据实际需求,转换或者增加一些字段,存入到es中
### 安装教程
项目除了使用到了Java和Spring Boot框架外,还有需要安装canal、MySQL和ElasticSearch, 此外若要抓取的数据还需要前往高德地图申请key
下面是这些软件的版本和安装地址,其中mysql和java若已经安装了,直接用已安装的版本问题应该不大
| 软件 | 版本 | 下载连接 |
|---------------|--------|---------------------------------------------------------------------|
| Java | jdk1.8 | |
| MySQL | 8.0.28 | |
| Canal | 1.1.4 | |
| ElasticSearch | 7.8.0 | |
安装后,canal需要配置监听的数据库信息,mysql需要开启binlog,详细步骤可看
### 项目结构
master分支因为要通过excel导入地区表,poi字典表等进入数据库,所以看看起来多了一点easyExcel的操作,
不了解且对easyExcel不是很感兴趣的的同学和切换到simple分支,快速了项目结构

项目的代码结构和大概作用如下:

### 启动准备和测试
项目启动前先看以下是软件有无启动或配置成功
1. canal服务端
2. elasticSearch,并查看配置文件的端口号是否与启动的服务端一致
3. MySQL数据库的连接和密码是否和你的一样,相应的数据库和表创建了没有(建表语句在doc文件的CreateTable.sql),
是否已初始化了表poi_code和address_code(可以通过MySQL导入initDicTable.sql初始化、 也可以通过ExcelController导入Excel初始化)
4. 配置了高德地图key没有,若需配置多个key,多个key以逗号分割,逗号后面不要有空格(高德地图申请key)。虽然我也有key,但奈何使用次数有限,就不放项目上去了
5. 接下来可以根据poiCode和地址查询自己喜欢的数据啦
利用postMan请求发送请求,若成功返回,过几秒后控制台有canal客户端日志输出,查看ElasticSearch成功接收到数据,则项目启动成功。
postman请求URL: ```http://localhost:8080/test/getPoi2```
请求参数:
```json
{
"types" : "110103",
"region" : 110000,
"page_num" : 1,
"page_size" : 20
}
```
预计返回内容
```json
{
"status": 1,
"count": 20,
"info": "OK",
"infocode": "10000",
"pois": [
{
"id": "B000A9PI2V",
"name": "地坛公园-牡丹园",
"type": "风景名胜;公园广场;植物园",
"typecode": "110103",
"address": "安定门外大街2号地坛公园内(东北角)",
"location": "116.416823,39.954899",
"adcode": "110101",
"timestamp": null,
"photos": [
{
"title": "",
"url": "http://store.is.autonavi.com/showpic/53bb4fb0a310502a4d11000f"
},
{
"title": "",
"url": "http://store.is.autonavi.com/showpic/53bb4fb0a310502a4d11007b"
}
],
"business": {
"tag": null,
"tel": "010-64214657",
"rating": "4.3",
"cost": null
}
},
{
"id": "B000A8506P",
"name": "妙峰樱桃沉浸营地",
"......" : "......"
}
]
}
```
### 项目有何用
其实.. 这个我也暂时... 还有有点作用的...... 比如至少学会了一种数据同步方式
### 如果实在启动不来欢迎私信我
~~(女士优先)~~