课程简介:从实际需求分析开始,打造个人博客检索系统。内容涵盖: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
目录
第5章 SpringBoot集成ES
视频:5-1 分词器介绍(01:40)
视频:5-2 IK分词器的安装和使用(11:50)
01、默认分词器standard
02、ik分词器
视频:5-3 springboot项目搭建(08:45)
01、新建springboot项目
02、application.properties文件配置
03、启动springboot项目
视频:5-4 项目结构和JPA演示(10:03)
java-toc" style="margin-left:80px;">01、IndexController.java
java-toc" style="margin-left:80px;">02、MysqlBlog.java
java-toc" style="margin-left:80px;">03、MysqlBlogReposity.java
java-toc" style="margin-left:80px;">04、SpringbootEsApplication.java
05、index.html
视频:5-5 Springboot集成ES(11:59)
视频:5-6 项目后端REST API实现(17:07)
视频:5-7 项目前端VUE视图渲染(21:49)
第6章 课程回顾与总结
视频:6-1 课程回顾与总结(05:04)
第5章 SpringBoot集成ES
视频:5-1 分词器介绍(01:40)
分词器:全文检索服务需要对文本内容进行拆分才能够进行有效的索引。
- standard:默认分词器,将词汇单元转成小写,并去除标点符号,支持中文,单字切分;
- simple:通过非字母字符分割文本信息,去除数字类型字符;
- whitespace:去除空格,不支持中文;
- language:不支持中文。
视频:5-2 IK分词器的安装和使用(11:50)
01、默认分词器standard
POST _analyze
{
"analyzer": "standard",
"text": "hello imooc,我是中国人。"
}
02、ik分词器
ik分词器:es开源社区对中文分词最好的第三方插件。
ik分词器下载地址:
- GitHub - medcl/elasticsearch-analysis-ik
- Releases · medcl/elasticsearch-analysis-ik · GitHub
- https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.3.2
安装ik分词器:
ik分词器:ik_smart、ik_max_word。
在main.dic文件中,添加“慕课网”,重启es进行测试:
视频:5-3 springboot项目搭建(08:45)
01、新建springboot项目
- Spring Boot DevTools:修改java类、静态资源、模板文件后,不需要频繁地重启项目就可以看到修改后的变化;
- Lombok:简化开发者代码量;
- Spring Configuration Processor:spring配置集成。
前后端分离项目,不需要勾选模板引擎(Template Engines)。
02、application.properties文件配置
# 通用数据源配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
# Hikari 数据源专用配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
# JPA相关配置
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
# es
spring.data.elasticsearch.cluster-node=127.0.0.1:9300
spring.data.elasticsearch.cluster-name=my-application
# mvc
spring.mvc.static-path-pattern=/**
spring.devtools.livereload.enabled=true
spring.devtools.restart.additional-paths=static/**
# 日期格式化
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
03、启动springboot项目
遇到的bug:
Maven导入Spring-boot依赖时一直卡在Resolving dependencies of …的处理方法
Maven导入Spring-boot依赖时一直卡在Resolving dependencies of …的处理方法_小白典的博客-CSDN博客
- java: 错误: 无效的源发行版:17
- JAVA‘无效目标发行版 17’的解决方案_普通网友的博客-CSDN博客_无效目标发行版
- Plugin 'org.springframework.boot:spring-boot-maven-plugin:' not found
- 成功解决 Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found_Cheney822的博客-CSDN博客
- java: 无法访问org.springframework.boot.SpringApplication
错误的类文件: /F:/maven_repository/org/springframework/boot/spring-boot/3.0.2/spring-boot-3.0.2.jar!/org/springframework/boot/SpringApplication.class
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。
- java: 无法访问org.springframework.boot.SpringApplication解决办法_极客李华的博客-CSDN博客
视频:5-4 项目结构和JPA演示(10:03)
SpringBoot框架内置Tomcat,使用idea时不需要再配置tomcat了。
java">01、IndexController.java
java">package cn.imooc.demo.springboot.es.controller;
import cn.imooc.demo.springboot.es.entity.mysql.MysqlBlog;
import cn.imooc.demo.springboot.es.repository.mysql.MysqlBlogRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class IndexController {
@Autowired
private MysqlBlogRepository msqlBlogRepository;
@RequestMapping("/")//访问资源的路径
public String index() {
List<MysqlBlog> list = msqlBlogRepository.findAll();
System.out.println(list.size());
return "index.html";
}
}
java">02、MysqlBlog.java
java">package cn.imooc.demo.springboot.es.entity.mysql;
import lombok.Data;
import javax.persistence.*;
/**
* 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;
*/
@Entity
@Data
@Table(name = "t_blog")//对应mysql数据库中的数据表
public class MysqlBlog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//主键id生成策略(此处设定为mysql的自增长id)
private Integer id;//对应t_blog主键id
private String title;
private String author;
@Column(columnDefinition = "mediumtext")//定义content对应指定mediumtext列
private String content;
//驼峰jpa自动转化
private String createTime;
private String updateTime;
// public static void main(String[] args) {
// MysqlBlog m = new MysqlBlog();
// m.setAuthor("666");
// }
}
java">03、MysqlBlogReposity.java
java">package cn.imooc.demo.springboot.es.repository.mysql;
import cn.imooc.demo.springboot.es.entity.mysql.MysqlBlog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface MysqlBlogRepository extends JpaRepository<MysqlBlog, Integer> {//<实体类型, 实体主键类型>
@Query("select e from MysqlBlog e order by e.createTime desc")
List<MysqlBlog> queryAll();
@Query("select e from MysqlBlog e where e.title like concat('%',:keyword,'%') or e.content like concat('%',:keyword,'%') order by e.createTime desc")
List<MysqlBlog> queryBlogs(@Param("keyword") String keyword);
}
java">04、SpringbootEsApplication.java
java">package cn.imooc.demo.springboot.es;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootEsApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootEsApplication.class, args);
}
}
05、index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>springboot+es构建博客检索系统</title>
</head>
<body>
hello world!——upward
</body>
</html>
视频:5-5 Springboot集成ES(11:59)
步骤:
- 配置es实体映射:EsBlog.java
- 在repository中建立一个和es交互的dao层
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.imooc.demo</groupId>
<artifactId>springboot_es</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_es</name>
<description>springboot_es</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.6</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
RestStatusException{status=500} org.springframework.data.elasticsearch.RestStatusException: Elasticsearch exception [type=json_parse_exception, reason=Current token (VALUE_NUMBER_INT) not of boolean type
at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@4fcc28b8; line: 1, column: 137]]; nested exception is ElasticsearchStatusException[Elasticsearch exception [type=json_parse_exception, reason=Current token (VALUE_NUMBER_INT) not of boolean type
at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@4fcc28b8; line: 1, column: 137]]]错误原因:当前最新版springboot 2.7.6相匹配的spring-boot-starter-data-elasticsearch支持的是elasticsearch 7.x.x版本,然而本门课程使用的是elasticsearch 6.3.2,解决方法:①升级elasticsearch到7.x.x版本;②使用过去的springboot版本,我尝试了2.2.0.RELEASE版本的springboot,这个错误就不再出现了,推荐此方法因为比较容易修改只需更新pom.xml。
Maven相关:
org.springframework.data.elasticsearch.ElasticsearchException: Error while searching for request: SearchRequest{searchType=QUERY_THEN_FETCH, indices=[blog], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[esblog], routing='null', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128, allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, source={"query":{"match_all":{"boost":1.0}}}}
需要启动es,点击D:\elastic\elasticSearch\elasticsearch-6.3.2\bin\elasticsearch.bat启动es。
ElasticsearchStatusException[Elasticsearch exception [type=illegal_argument_exception, reason=request [/blog/esblog/_search] contains unrecognized parameters: [ignore_throttled], [rest_total_hits_as_int]]]
视频:5-6 项目后端REST API实现(17:07)
视频:5-7 项目前端VUE视图渲染(21:49)
第6章 课程回顾与总结
视频:6-1 课程回顾与总结(05:04)
Elastic相关产品下载地址:
- ElasticSearch:Elasticsearch:官方分布式搜索和分析引擎 | Elastic
- Kibana:Kibana:数据的探索、可视化和分析 | Elastic
- Logstash:Logstash:收集、解析和转换日志 | Elastic