ITPub博客

首页 > IT基础架构 > > 使用Spring Boot + ElasticSearch实现博客的全文检索(项目创建&技术准备)

使用Spring Boot + ElasticSearch实现博客的全文检索(项目创建&技术准备)

作者:格伯纳 时间:2020-05-22 15:22:18 0 删除 编辑

1)项目介绍

本项目是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版本有要求,过高过低都可能导致启动失败!

2)项目创建

使用Spring Boot Initializer初始化项目,这里Spring Boot的版本是2.2.6,勾选必要依赖:

3)项目数据库设计

本项目的侧重点是博客文章的检索,设计从简,表数据不再提供,可提前从网上搜索长篇幅文章填充数据,方便后面使用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;

4)为什么要使用ElasticSearch

其实数据检索并非Mysql不能做,而是不适合做全文的检索。全文检索往往需要匹配大量的文本,如果还使用Mysql的like模糊查询将导致性能直线下滑,所谓“术业有专攻”,Mysql更擅长的是基于主键索引的查询,要想保证大文本的匹配查询的性能就要用到像ES这样的全文检索引擎。

!ElasticSearch的基础介绍和安装启动参照《入门全文检索引擎ElasticSearch》

5)Mysql与ElasticSearch的数据同步

我们要使用Mysql保存文章数据,ES则需要从Mysql中获取数据并提供检索服务;由于Mysql中的数据是不断变化的,所以需要能够让两者数据保持一致的手段,也就是数据的同步操作。

Mysql与ES的数据同步有两种方式:全量和增量,全量就是在ES中建立好索引之后一次性把Mysql中的数据发送(同步)到ES中,然而数据是会增长的,每天都有可能发生数据的增加、修改及删除,这时我们就需要以增量的方式将Mysql中增加或发生改变的数据同步到ES中。

官方提供了一款Mysql到ES的数据同步中间件logstash,使用它可以帮助我们做到Mysql到ES的数据同步。ES官网有提供下载,但是国内访问速度慢,可以在华为云镜像站下载对应版本的压缩包。

5.1)编写Logstash启动配置

要让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版本上可能出现的问题。

5.2)解决logstash启动无法加载mysql驱动的问题

  1. 从logstash-input-jdbc插件Github地址点击releases直接下载其中的tar.gz文件包,这里下载的是最新版本的 v4.3.19,使用命令解压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插件已经安装成功了:

使用logstash将Mysql中的数据同步到ES

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

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

至此基础环境已经搭建完毕,接下来是编码阶段,详见《使用Spring Boot + ElasticSearch实现博客的全文检索(开始项目编码)》。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3154617/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 活动案例
请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984392