当前位置: 首页 > news >正文

Springboot+ElasticSearch构建博客检索系统-学习笔记01

课程简介:从实际需求分析开始,打造个人博客检索系统。内容涵盖:ES安装、ES基本概念和数据类型、Mysql到ES数据同步、SpringBoot操作ES。通过本课,让学员对ES有一个初步认识,理解ES的一些适用场景,以及如何使用springboot来同ES进行交互。


视频地址:

  1. Springboot + ElasticSearch 构建博客检索系统-慕课网

博客笔记:

  1. Springboot+ElasticSearch构建博客检索系统-学习笔记01
  2. Springboot+ElasticSearch构建博客检索系统-学习笔记02

参考笔记:

  1. ElasticSearch与Springboot结合入门学习_hyyyya的博客-CSDN博客
  2. GitHub - holic-x/springboot-es: 基于springboot-es的博客检索系统
  3. GitHub - gaohanghang/springboot-blog-es: Springboot + ElasticSearch 构建博客检索系统
  4. 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”时间对比:

  1. mysql:3004ms
  2. elasticsearch:7ms

思维导图-开发技术栈:

第2章 初识ElasticSearch

视频:2-1 ElasticSearch概念和适用场景(04:46)

 

  1. 分布式:单点或多节点集群运行,node节点、cluster集群;
  2. 全文检索:标题+内容;
  3. 实时快速:速度快;
  4. Restful:接口。

视频:2-2 ElasticSearch数据类型和关系型数据库的对比(02:19)

es官方:在一个index中尽量保持一个type。

  1. index:数据库;
  2. type:数据表;
  3. document:一行一行的数据;
  4. field:字段;
  5. mapping:数据字段定义。

视频:2-3 安装ES、postman、kibana(06:30)

es由java实现,es版本6.3.2、jdk1.8。

  1. 免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic
  2. Elasticsearch:官方分布式搜索和分析引擎 | Elastic

 

kibana:开源的分析与可视化(图表、饼图)平台,用于与es协同工作。


kibana下载地址:Download Kibana Free | Get Started Now | Elastic


 

视频:2-4 演示postman、kibana对ES的交互(11:46)

01、Postman的使用

 

  1. GET:获取数据
  2. PUT:创建索引
  3. DEL:删除索引
  4. POST:修改数据
localhost:9200/_all
localhost:9200/testlocalhost: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/1POST /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 TransferSource Server         : localhost
Source Server Version : 50557
Source Host           : localhost:3306
Source Database       : blogTarget 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。

  1. logstash就像一个管道,一头连接着数据源,一头连接着es。
  2. logstash的输入数据源有很多,log4j日志文件。
  3. logstash-jdbc用于对接mysql这一类的数据源,实现要求:id对应es中的_id;mysql表中需要有标识创建数据或更新数据时间的字段time,通过与时间的比较完成增量的同步。

视频:4-2 Logstash全量、增量同步解决方案(10:30)

01、下载并安装logstash

logstash下载地址

  1. Logstash:收集、解析和转换日志 | Elastic
  2. 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.jarjdbc_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 : porthosts => ["127.0.0.1:9200"]# 索引index => "blog"# _id (取到mysql数据库记录的id)document_id => "%{id}"}
}

03、使用kibana进行数据连接测试

注意:kibana数据从Elasticsearch而来,在启动kibana需要先启动Elasticsearch。

启动kibana步骤:

  1. 先启动elasticsearch:F:\elasticSearch\elasticsearch-6.3.2\bin\elasticsearch.bat
  2. 再启动kibana:F:\elasticSearch\kibana-6.3.2-windows-x86_64\bin\kibana.bat

04、将mysql数据同步到es中

logstash -f ../config/mysql.conf

  1. -f:指定自己设置的配置文件
  2. config/mysql.conf:配置文件存储位置

使用kibana开发工具查看mysql数据是否成功同步到es中:

GET /blog/_stats

POST /blog/_search
{
}

05、mysql.conf文件sql语句解析

  1. Select * from t_blog where update_time >:sql_last_value order by update_time DESC;
  2. R12、R22等临界点数据始终不会被扫描到,始终不会被同步到es中。
  3. Select * from t_blog where update_time >=:sql_last_value order by update_time DESC;
  4. 为了使R12、R22等临界点数据被扫描到,被同步到es中。
  5. 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)

http://www.lryc.cn/news/7517.html

相关文章:

  • vue3+element-plus el-descriptions 详情组件二次封装(vue3项目)
  • No.14新一代信息技术
  • 微信小程序开发(五)小程序代码组成2
  • 关于tensorboard --logdir=logs的报错解决办法记录
  • em,rem,px,rpx,vw,vh的区别与使用
  • Vue+node.js医院预约挂号信息管理系统vscode
  • Java真的不难(五十四)RabbitMQ的入门及使用
  • Unity | Script Hot Reload
  • 3|射频识别技术|第五讲:数据通信和编码技术|第九章:编码与调制|重点理解掌握传输介质中的有线传输介质
  • 【遇见青山】基于Redis的Feed流实现案例
  • 【芯片前端】一文搞定|寄存器组织生成与uvm ral_model环境全流程
  • Leetcode力扣秋招刷题路-0061
  • xilinx srio ip学习笔记之axistream接口
  • 轨迹误差评估指标[APE/RPE]和EVO
  • uni-app 消息推送功能UniPush
  • 面试题(二十六)场景应用
  • 密码技术在车联网安全中的应用与挑战
  • 富媒体数据管理解决方案:简化、优化、自动化
  • QT入门Input Widgets之QFontComboBox、QTextEdit、QPlainTextEdit、QDial、QKeySequenceEdit
  • Java企业级开发学习笔记
  • 【算法基础】(一)基础算法 ---高精度
  • 电源口防雷器电路设计方案
  • 【零基础入门前端系列】—表单(七)
  • Linux安装python3
  • 怎么通过中级职称有窍门吗?
  • SAP ABAP根据事务码查找增强最直接的方法
  • HTTP协议——详细讲解
  • echonet-dynamic代码解读
  • 大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害怎样解决?
  • 字符串内存分配