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

news/2024/7/7 5:55:32 标签: elasticsearch, spring boot, java, intellij idea, mysql

课程简介:从实际需求分析开始,打造个人博客检索系统。内容涵盖: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

目录

第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)

分词器:全文检索服务需要对文本内容进行拆分才能够进行有效的索引。

  1. standard:默认分词器,将词汇单元转成小写,并去除标点符号,支持中文,单字切分;
  2. simple:通过非字母字符分割文本信息,去除数字类型字符;
  3. whitespace:去除空格,不支持中文;
  4. language:不支持中文。

视频:5-2 IK分词器的安装和使用(11:50)

01、默认分词器standard

POST _analyze
{
  "analyzer": "standard",
  "text": "hello imooc,
我是中国人。"
}

02、ik分词器

ik分词器:es开源社区对中文分词最好的第三方插件。

ik分词器下载地址:

  1. GitHub - medcl/elasticsearch-analysis-ik
  2. Releases · medcl/elasticsearch-analysis-ik · GitHub
  3. 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项目

 

  1. Spring Boot DevTools:修改java类、静态资源、模板文件后,不需要频繁地重启项目就可以看到修改后的变化;
  2. Lombok:简化开发者代码量;
  3. 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)

步骤:

  1. 配置es实体映射:EsBlog.java
  2. 在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相关:

  1. https://mvnrepository.com/artifact/mysql/mysql-connector-java
  2. 如何查看SPRING-BOOT历史版本_Nakano_May的博客-CSDN博客
  3. Index of /spring-boot/docs

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相关产品下载地址:

  1. ElasticSearch:Elasticsearch:官方分布式搜索和分析引擎 | Elastic
  2. Kibana:Kibana:数据的探索、可视化和分析 | Elastic
  3. Logstash:Logstash:收集、解析和转换日志 | Elastic


http://www.niftyadmin.cn/n/76449.html

相关文章

Dubbo学习笔记2

Dubbo学习笔记&#xff08;二&#xff09; Dubbo常用配置 覆盖策略 规则&#xff1a; 1、精确优先&#xff08;方法级优先&#xff0c;接口次之&#xff0c;全局配置再次之&#xff09; 2、消费者设置优先&#xff08;如果级别一样&#xff0c;则消费方优先&#xff0c;提供…

把Typora图片自动上传网

闲话少说 总共三步下载PicGohttps://github.com/Molunerfinn/PicGo/releases/download/v2.3.1/PicGo-Setup-2.3.1-x64.exe直接点就行这里略过Gitee我们需要使用 Git 来保存我们的图片&#xff0c;又因为国内访问 Github 速度比较慢&#xff0c;所以这里推荐使用国内的 Git 托管…

高可用的“异地多活”架构设计

前言 后台服务可以划分为两类&#xff0c;有状态和无状态。高可用对于无状态的应用来说是比较简单的&#xff0c;无状态的应用&#xff0c;只需要通过 F5 或者任何代理的方式就可以很好的解决。后文描述的主要是针对有状态的服务进行分析。 服务端进行状态维护主要是通过磁盘…

清风1.层次分析法

一.流程1.建立评价体系2.建立判断矩阵2.1 A-C-C矩阵从准则层对目标层的特征向量上看&#xff0c;花费的权重最大算术平均法求权重的结果为&#xff1a;0.26230.47440.05450.09850.1103几何平均法求权重的结果为&#xff1a;0.26360.47730.05310.09880.1072特征值法求权重的结果…

阿里云_山东鼎信短信的使用(云市场)

目录山东鼎信API工具类随机验证码工具类进行测试Pom依赖(可以先导入依赖)创建controllerSmsServiceSmsServiceImplswagger测试(也可以使用postman)山东鼎信API工具类 山东鼎信短信官网 找到java的Api&#xff0c;复制下来 适当改了一下&#xff0c;为了调用(类名SmsUtils) p…

Allegro如何更改DRC尺寸大小操作指导

Allegro如何更改DRC尺寸大小操作指导 在做PCB设计的时候,DRC可以辅助设计,有的时候DRC的尺寸过大会影响视觉,Allegro支持将DRC的尺寸变小或者改大 如下图,DRC尺寸过大 如何改小,具体操作如下 点击Setup选择Design Parameters

[MySQL]初识数据库

哈喽&#xff0c;大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是 MySQL 数据库&#xff0c;也是新的知识&#xff0c;首先我们会初步认识什么是数据库&#xff0c;什么是Mysql 数据库&#xff0c;以及我们 mysql 主要学什么&#xff0c;SQL 语句简单使用&…

华为OD机试 - 跳格子(Python)

跳格子 题目 地上共有N个格子,你需要跳完地上所有的格子, 但是格子间是有强依赖关系的,跳完前一个格子后, 后续的格子才会被开启,格子间的依赖关系由多组steps数组给出, steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子: 比如[0,1]表示从跳完第0个格子以后…