本项目是Spring Boot + ES + Vue.js开发的一个前后端分离的小项目,使用的操作系统是Ubuntu18.04,ElasticSearch和Logstash的版本都是7.3.2;系统安装的是JDK13(ElasticSearch需要Java支持,这里我安装了JDK13,所以只能使用ElasticSearch7.x的版本,否则无法启动);Mysql的版本是8.0.18。要注意ElasticSearch和Logstash对JDK版本有要求,过高过低都可能导致启动失败!
使用Spring Boot Initializer初始化项目,这里Spring Boot的版本是2.2.6,勾选必要依赖:


本项目的侧重点是博客文章的检索,设计从简,表数据不再提供,可提前从网上搜索长篇幅文章填充数据,方便后面使用logstash同步数据到ES。
-- 创建数据库
DROP DATABASE IF EXISTS `es_blog`;
CREATE DATABASE `es_blog`;
-- 创建博客(文章)表
CREATE TABLE `t_article`
(
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '博客表自增ID',
`title` varchar(60) DEFAULT NULL COMMENT '博客标题',
`author` varchar(60) DEFAULT NULL COMMENT '博客作者',
`content` mediumtext COMMENT '博客内容',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT charset = utf8mb4;其实数据检索并非Mysql不能做,而是不适合做全文的检索。全文检索往往需要匹配大量的文本,如果还使用Mysql的like模糊查询将导致性能直线下滑,所谓“术业有专攻”,Mysql更擅长的是基于主键索引的查询,要想保证大文本的匹配查询的性能就要用到像ES这样的全文检索引擎。
!ElasticSearch的基础介绍和安装启动参照《入门全文检索引擎ElasticSearch》
我们要使用Mysql保存文章数据,ES则需要从Mysql中获取数据并提供检索服务;由于Mysql中的数据是不断变化的,所以需要能够让两者数据保持一致的手段,也就是数据的同步操作。
Mysql与ES的数据同步有两种方式:全量和增量,全量就是在ES中建立好索引之后一次性把Mysql中的数据发送(同步)到ES中,然而数据是会增长的,每天都有可能发生数据的增加、修改及删除,这时我们就需要以增量的方式将Mysql中增加或发生改变的数据同步到ES中。
官方提供了一款Mysql到ES的数据同步中间件logstash,使用它可以帮助我们做到Mysql到ES的数据同步。ES官网有提供下载,但是国内访问速度慢,可以在华为云镜像站下载对应版本的压缩包。
要让logstash知道要同步的数据库,需要一定的配置告知,在logstash的config目录下创建一个名为mysql.conf的配置文件(文件名随意,后缀必须为.conf):
input {
jdbc {
# myslq驱动,已经放置到logstash的目录下
jdbc_driver_library => "../mysql-connector-java-8.0.18.jar"
# Mysql驱动类全类名,注意mysql8.x以上需要加cj
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
# mysql连接url
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/es_blog"
# mysql 用户名
jdbc_user => "root"
# mysql 密码
jdbc_password => "tiny"
# 设置定时任务,多久执行一次查询,默认一分钟,需要无延迟可使用schedule => "* * * * * *"
schedule => "* * * * *"
# 清空上次的sql_last_value记录
clean_run => true
# 要执行的sql(同步)语句
statement => "select * from t_article where update_time > :sql_last_value and update_time < now() order by update_time desc"
}
}
output {
elasticsearch {
# 数据查询
statement => "select * from t_article
# es主机和端口
hosts => ["127.0.0.1:9200"]
# 同步数据在ES的索引名称
index => "blog"
# es文档的id,表示使用mysql表的id
document_id => "%{id}"
}
}logstash要与Mysql交互需要数据库驱动,我下载的是对应8.0.18版本的驱动,解压后将mysql-connector-java-8.0.18.jar拷贝到logstash的目录下,此时如果直接启动logstash会报错:LogStash::ConfigurationError 2012 com.mysql.cj.jdbc.Driver not loaded. Are you sure you've included the correct jdbc driver in :jdbc_driver_library?,这是在logstash7.x版本上可能出现的问题。
sudo tar -zxvf logstash-input-jdbc-4.3.19.tar.gz,进入到解压后的文件夹下,接下来要使用到gem命令,这需要Ruby环境支持,Ubuntu下直接使用sudo apt install ruby安装,之后执行gem build logstash-input-jdbc.gemspec生成gem文件,如下表示执行成功:
2. 接下来把目录下生成的gem文件复制到logstash的bin目录下,进入到logstash的bin目录,执行./logstash-plugin install logstash-input-jdbc-4.3.19.gem,看到如下反馈表示logstash-input-jdbc插件已经安装成功了:

这里我提前往Mysql数据库中插入了一条数据博客数据,再次进到logstash的bin目录下执行./logstash -f ../config/mysql.conf启动Lostash,可以看到此时的logstash正定时执行我们在配置文件中定义的SQL语句同步数据:

打开打开浏览器查看一下ES中的数据:

至此基础环境已经搭建完毕,接下来是编码阶段,详见《使用Spring Boot + ElasticSearch实现博客的全文检索(开始项目编码)》。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3154617/ ,如需转载,请注明出处,否则将追究法律责任。