课程简介:从实际需求分析开始,打造个人博客检索系统。内容涵盖:ES安装、ES基本概念和数据类型、Mysql到ES数据同步、SpringBoot操作ES。通过本课,让学员对ES有一个初步认识,理解ES的一些适用场景,以及如何使用springboot来同ES进行交互。
视频地址:
- Springboot + ElasticSearch 构建博客检索系统-慕课网
博客笔记:
- Springboot+ElasticSearch构建博客检索系统-学习笔记01
- Springboot+ElasticSearch构建博客检索系统-学习笔记02
参考笔记:
- ElasticSearch与Springboot结合入门学习_hyyyya的博客-CSDN博客
- GitHub - holic-x/springboot-es: 基于springboot-es的博客检索系统
- GitHub - gaohanghang/springboot-blog-es: Springboot + ElasticSearch 构建博客检索系统
- GitHub - Hyyellow/ElasticSearch_Demo: ES框架的初步尝试Demo
目录
第1章 课程介绍
视频:1-1 课程导学(08:33)
第2章 初识ElasticSearch
视频:2-1 ElasticSearch概念和适用场景(04:46)
视频:2-2 ElasticSearch数据类型和关系型数据库的对比(02:19)
视频:2-3 安装ES、postman、kibana(06:30)
视频:2-4 演示postman、kibana对ES的交互(11:46)
01、Postman的使用
02、kibana的DevTools使用
第3章 博客网站全文检索
视频:3-1 基于Mysql实现(07:29)
01、创建数据库数据表
02、测试sql查询语句
03、mysql检索数据原理分析
视频:3-2 基于ES实现(04:57)
第4章 Mysql、ES数据同步
视频:4-1 数据同步中间件(09:02)
视频:4-2 Logstash全量、增量同步解决方案(10:30)
01、下载并安装logstash
02、引入mysql连接jar包并配置mysql.conf文件
03、使用kibana进行数据连接测试
04、将mysql数据同步到es中
05、mysql.conf文件sql语句解析
第5章 SpringBoot集成ES
第6章 课程回顾与总结
第1章 课程介绍
视频:1-1 课程导学(08:33)
搜索“elasticsearch”时间对比:
- mysql:3004ms
- elasticsearch:7ms
思维导图-开发技术栈:
第2章 初识ElasticSearch
视频:2-1 ElasticSearch概念和适用场景(04:46)
![]()
- 分布式:单点或多节点集群运行,node节点、cluster集群;
- 全文检索:标题+内容;
- 实时快速:速度快;
- Restful:接口。
视频:2-2 ElasticSearch数据类型和关系型数据库的对比(02:19)
es官方:在一个index中尽量保持一个type。
- index:数据库;
- type:数据表;
- document:一行一行的数据;
- field:字段;
- mapping:数据字段定义。
视频:2-3 安装ES、postman、kibana(06:30)
es由java实现,es版本6.3.2、jdk1.8。
- 免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic
- Elasticsearch:官方分布式搜索和分析引擎 | Elastic
![]()
kibana:开源的分析与可视化(图表、饼图)平台,用于与es协同工作。
kibana下载地址:Download Kibana Free | Get Started Now | Elastic
![]()
视频:2-4 演示postman、kibana对ES的交互(11:46)
01、Postman的使用
![]()
- GET:获取数据
- PUT:创建索引
- DEL:删除索引
- POST:修改数据
localhost:9200/_all
localhost:9200/test
localhost:9200/person/_doc/1
{
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing.",
"interests": ["sports", "music"]
}
localhost:9200/person/_doc/2
{
"first_name": "Eric",
"last_name": "Smith",
"age": 23,
"about": "I love basketball.",
"interests": ["sports", "reading"]
}
localhost:9200/person/_doc/_search?q=first_name:john
02、kibana的DevTools使用
使用kibana的Dev Tools发送结构化的查询语句,来同ES进行简单的交互。
告诉es使用者要查询的索引之后,用“_type”标识默认的唯一的type;在es6.0版本之后,官方推荐一个索引一个type,推荐不写type。
GET _all
GET /person/_doc/1
POST /person/_search
{
"query": {
"bool": {
"should": [ //should:应该做什么事情
{
"match": { //match:匹配
"first_name": "Eric" //"last_name": "Smith"
}
}
]
}
}
}
POST /person/_search
{
"query": {
"bool": {
"should": [ // must:必须
{
"match": {
"last_name": "Smith"
}
},
{
"match": {
"about": "basketball"
}
}
]
}
}
}
第3章 博客网站全文检索
视频:3-1 基于Mysql实现(07:29)
01、创建数据库数据表
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50557
Source Host : localhost:3306
Source Database : blog
Target Server Type : MYSQL
Target Server Version : 50557
File Encoding : 65001
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_blog
-- ----------------------------
DROP TABLE IF EXISTS `t_blog`;
CREATE TABLE `t_blog` (
`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=9 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of t_blog
-- ----------------------------
INSERT INTO `t_blog` VALUES ('1', 'Springboot 为什么这', 'noob', '没错 Springboot ', '2019-12-08 01:44:29', '2019-12-08 01:44:34');
INSERT INTO `t_blog` VALUES ('3', 'Springboot 中 Redis', 'noob', 'Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。\\n\\n使用Redis\\nRedis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。\\n\\nRedis官网\\nRedis中文社区\\n引入依赖\\nSpring Boot提供的数据访问框架Spring Data Redis基于Jedis。可以通过引入spring-boot-starter-redis来配置依赖关系。\\n\\n\\n org.springframework.boot\\n spring-boot-starter-redis\\n\\n注意不同版本的spring boot下,redis的starter依赖名略有不同,如果上面的不行,可以尝试spring-boot-starter-data-redis\\n\\n参数配置\\n按照惯例在application.properties中加入Redis服务端的相关配置,具体说明如下:\\n\\n# REDIS (RedisProperties)\\n# Redis数据库索引(默认为0)\\nspring.redis.database=0\\n# Redis服务器地址\\nspring.redis.host=localhost\\n# Redis服务器连接端口\\nspring.redis.port=6379\\n# Redis服务器连接密码(默认为空)\\nspring.redis.password=\\n# 连接池最大连接数(使用负值表示没有限制)\\nspring.redis.pool.max-active=8\\n# 连接池最大阻塞等待时间(使用负值表示没有限制)\\nspring.redis.pool.max-wait=-1\\n# 连接池中的最大空闲连接\\nspring.redis.pool.max-idle=8\\n# 连接池中的最小空闲连接\\nspring.redis.pool.min-idle=0\\n# 连接超时时间(毫秒)\\nspring.redis.timeout=0\\n其中spring.redis.database的配置通常使用0即可,Redis在配置的时候可以设置数据库数量,默认为16,可以理解为数据库的schema\\n\\n测试访问\\n通过编写测试用例,举例说明如何访问Redis。\\n\\n@RunWith(SpringJUnit4ClassRunner.class)\\n@SpringApplicationConfiguration(Application.class)\\npublic class ApplicationTests {\\n\\n @Autowired\\n private StringRedisTemplate stringRedisTemplate;\\n\\n @Test\\n public void test() throws Exception {\\n\\n // 保存字符串\\n stringRedisTemplate.opsForValue().set(\"aaa\", \"111\");\\n Assert.assertEquals(\"111\", stringRedisTemplate.opsForValue().get(\"aaa\"));\\n\\n }\\n\\n}\\n通过上面这段极为简单的测试案例演示了如何通过自动配置的StringRedisTemplate对象进行Redis的读写操作,该对象从命名中就可注意到支持的是String类型。如果有使用过spring-data-redis的开发者一定熟悉RedisTemplate<K, V>接口,StringRedisTemplate就相当于RedisTemplate<String, String>的实现。\\n\\n除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。\\n\\n创建要存储的对象:User\\npublic class User implements Serializable {\\n\\n private static final long serialVersionUID = -1L;\\n\\n private String username;\\n private Integer age;\\n\\n public User(String username, Integer age) {\\n this.username = username;\\n this.age = age;\\n }\\n\\n // 省略getter和setter\\n\\n}\\n实现对象的序列化接口\\n\\npublic class RedisObjectSerializer implements RedisSerializer {\\n\\n private Converter<Object, byte[]> serializer = new SerializingConverter();\\n private Converter<byte[], Object> deserializer = new DeserializingConverter();\\n\\n static final byte[] EMPTY_ARRAY = new byte[0];\\n\\n public Object deserialize(byte[] bytes) {\\n if (isEmpty(bytes)) {\\n return null;\\n }\\n\\n try {\\n return deserializer.convert(bytes);\\n } catch (Exception ex) {\\n throw new SerializationException(\"Cannot deserialize\", ex);\\n }\\n }\\n\\n public byte[] serialize(Object object) {\\n if (object == null) {\\n return EMPTY_ARRAY;\\n }\\n\\n try {\\n return serializer.convert(object);\\n } catch (Exception ex) {\\n return EMPTY_ARRAY;\\n }\\n }\\n\\n private boolean isEmpty(byte[] data) {\\n return (data == null || data.length == 0);\\n }\\n}\\n配置针对User的RedisTemplate实例\\n\\n@Configuration\\npublic class RedisConfig {\\n\\n @Bean\\n JedisConnectionFactory jedisConnectionFactory() {\\n return new JedisConnectionFactory();\\n }\\n\\n @Bean\\n public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {\\n RedisTemplate<String, User> template = new RedisTemplate<String, User>();\\n template.setConnectionFactory(jedisConnectionFactory());\\n template.setKeySerializer(new StringRedisSerializer());\\n template.setValueSerializer(new RedisObjectSerializer());\\n return template;\\n }\\n\\n\\n}\\n完成了配置工作后,编写测试用例实验效果\\n\\n@RunWith(SpringJUnit4ClassRunner.class)\\n@SpringApplicationConfiguration(Application.class)\\npublic class ApplicationTests {\\n\\n @Autowired\\n private RedisTemplate<String, User> redisTemplate;\\n\\n @Test\\n public void test() throws Exception {\\n\\n // 保存对象\\n User user = new User(\"超人\", 20);\\n redisTemplate.opsForValue().set(user.getUsername(), user);\\n\\n user = new User(\"蝙蝠侠\", 30);\\n redisTemplate.opsForValue().set(user.getUsername(), user);\\n\\n user = new User(\"蜘蛛侠\", 40);\\n redisTemplate.opsForValue().set(user.getUsername(), user);\\n\\n Assert.assertEquals(20, redisTemplate.opsForValue().get(\"超人\").getAge().longValue());\\n Assert.assertEquals(30, redisTemplate.opsForValue().get(\"蝙蝠侠\").getAge().longValue());\\n Assert.assertEquals(40, redisTemplate.opsForValue().get(\"蜘蛛侠\").getAge().longValue());\\n\\n }\\n\\n}\\n当然spring-data-redis中提供的数据操作远不止这些,本文仅作为在Spring Boot中使用redis时的配置参考,更多对于redis的操作使用,请参考Spring-data-redis Reference。\\n\\n代码示例\\n本文的相关例子可以查看下面仓库中的chapter3-2-5目录:\\n\\nGithub:https://github.com/dyc87112/SpringBoot-Learning\\nGitee:https://gitee.com/didispace/SpringBoot-Learning\\n如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!', '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('4', 'Springboot 中如何优化', 'noob', NULL, '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('5', 'Springboot 消息队列', 'noob', NULL, '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('6', 'Docker Compose + Springboot', 'noob', NULL, '2019-12-08 01:44:29', '2019-12-08 01:44:29');
INSERT INTO `t_blog` VALUES ('7', 'hello es', 'noob', 'hello es', '2019-12-08 01:44:29', '2019-12-08 01:44:29');
02、测试sql查询语句
SELECT * FROM t_blog WHERE title LIKE "%spring%" OR content LIKE "%spring%";
03、mysql检索数据原理分析
视频:3-2 基于ES实现(04:57)
第4章 Mysql、ES数据同步
视频:4-1 数据同步中间件(09:02)
![]()
es官方的数据收集及同步组件:logstash。
- logstash就像一个管道,一头连接着数据源,一头连接着es。
- logstash的输入数据源有很多,log4j日志文件。
- logstash-jdbc用于对接mysql这一类的数据源,实现要求:id对应es中的_id;mysql表中需要有标识创建数据或更新数据时间的字段time,通过与时间的比较完成增量的同步。
视频:4-2 Logstash全量、增量同步解决方案(10:30)
01、下载并安装logstash
logstash下载地址
- Logstash:收集、解析和转换日志 | Elastic
- Logstash 6.3.2 | Elastic
02、引入mysql连接jar包并配置mysql.conf文件
input {
jdbc {
# 指定jdbc驱动包位置(不同版本处理不同,此处可直接将mysql驱动包放置logstash-core/lib/jars下,无需配置jdbc_driver_library)
# "C:\\logstash-6.3.2\\mysql-connector-java-5.1.31.jar" /xxx/logstash-7.5.0/mysql-connector-java-5.1.31.jar
jdbc_driver_library => "F:\\logstash\\logstash-6.3.2\\mysql-connector-java-5.1.31.jar"
# 要使用的驱动包类,有过java开发经验的应该很熟悉这个了,不同的数据库调用的类不一样。
jdbc_driver_class => "com.mysql.jdbc.Driver"
# mysql数据库的连接信息
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/blog"
# mysql用户
jdbc_user => "root"
# mysql密码
jdbc_password => "root"
# 定时任务,多久执行一次查询,默认一分钟,如果想要没有延迟,可以使用 schedule => "* * * * * *"
# 定时任务,默认一分钟,"* * * * *"代表设置为无延迟
schedule => "* * * * *"
# *清空存储在logstash的上一次的sql_last_value记录*
clean_run => true
# 要执行的语句
statement => "select * FROM t_blog WHERE update_time > :sql_last_value AND update_time < NOW() ORDER BY update_time desc"
}
}
output {
elasticsearch {
# es host : port
hosts => ["127.0.0.1:9200"]
# 索引
index => "blog"
# _id (取到mysql数据库记录的id)
document_id => "%{id}"
}
}
03、使用kibana进行数据连接测试
注意:kibana数据从Elasticsearch而来,在启动kibana需要先启动Elasticsearch。
启动kibana步骤:
- 先启动elasticsearch:F:\elasticSearch\elasticsearch-6.3.2\bin\elasticsearch.bat
- 再启动kibana:F:\elasticSearch\kibana-6.3.2-windows-x86_64\bin\kibana.bat
04、将mysql数据同步到es中
logstash -f ../config/mysql.conf
- -f:指定自己设置的配置文件
- config/mysql.conf:配置文件存储位置
使用kibana开发工具查看mysql数据是否成功同步到es中:
GET /blog/_stats
POST /blog/_search
{
}
05、mysql.conf文件sql语句解析
- Select * from t_blog where update_time >:sql_last_value order by update_time DESC;
- R12、R22等临界点数据始终不会被扫描到,始终不会被同步到es中。
- Select * from t_blog where update_time >=:sql_last_value order by update_time DESC;
- 为了使R12、R22等临界点数据被扫描到,被同步到es中。
- Select * from t_blog where update_time >:sql_last_value and update_time < NOW() order by update_time DESC;
![]()
![]()
第5章 SpringBoot集成ES
Springboot+ElasticSearch构建博客检索系统-学习笔记02
视频:5-1 分词器介绍(01:40)
视频:5-2 IK分词器的安装和使用(11:50)
视频:5-3 springboot项目搭建(08:45)
视频:5-4 项目结构和JPA演示(10:03)
视频:5-5 Springboot集成ES(11:59)
视频:5-6 项目后端REST API实现(17:07)
视频:5-7 项目前端VUE视图渲染(21:49)
第6章 课程回顾与总结
Springboot+ElasticSearch构建博客检索系统-学习笔记02
视频:6-1 课程回顾与总结(05:04)