程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

  • 前端手册

  • 组件文档

  • 数据库分析

  • 集成插件

    • 集成 Docker 实现一键部署
    • 升级 Spring Boot 到 3.x 版本
    • 集成 Ehcache 实现本地缓存切换
    • 集成 WebSocket 实现实时通信
    • 集成 Electron 实现桌面应用程序
    • 集成 Atomikos 实现分布式事务
    • 集成 MinIO 实现分布式文件存储
    • 集成 Easy-ES 实现分布式全文检索
      • 1. 修改 ruoyi-common/pom.xml 添加 Easy-Es 依赖
      • 2. 修改 application.yml,添加 Easy-Es 配置
      • 3. 修改 RuoYiApplication 启动类
      • 4. 修改 SysNoticeMapper.xml
      • 5. 实现全局搜索功能
        • 5.1 创建 SysNoticeEsMapper
        • 5.2 修改 SysNoticeServiceImpl
      • 6. 测试与验证
      • 7. 重要 API 和参数说明
    • 使用 `localStorage` 代替 `cookie`
    • 使用 Undertow 替代 Tomcat 容器
    • 集成 Actuator 实现优雅关闭应用
    • 集成 AJ-Captcha 实现滑块验证码
    • 集成 Sharding-JDBC 实现分库分表
    • 集成 JustAuth 实现第三方授权登录
    • 集成 `watermark-dom` 实现页面水印
    • 集成 MyBatis-Plus 实现 MyBatis 增强
    • 集成 EasyExcel 实现 Excel 表格增强
    • 集成 Knife4j 实现 Swagger 文档增强
    • 集成 Redisson 实现 Redis 分布式锁
    • 集成 IP2Region 实现离线 IP 地址定位
    • 42集成 JSEncrypt 实现密码加密传输
    • 集成 HttpClient 实现 HTTP 接口增强
    • 集成 Druid 实现数据库密码加密功能
    • 集成 Browscap 实现用户代理解析
    • 集成 Dynamic-DataSource 实现多数据源增强
  • 若依框架
  • 集成插件
scholar
2024-08-31
目录

集成 Easy-ES 实现分布式全文检索

# 集成 Easy-Es 实现分布式全文检索

本文将介绍如何将 Easy-Es 集成到 RuoYi 项目中,以实现分布式全文检索功能。本示例将以系统管理模块中的“通知公告”为例,展示如何利用 Easy-Es 实现全文检索。Easy-Es 是一个简化 ElasticSearch 操作的开源框架,与 MyBatis-Plus API 一致,学习成本低且功能强大。

# 1. 修改 ruoyi-common/pom.xml 添加 Easy-Es 依赖

首先,我们需要将 Easy-Es 相关依赖添加到项目中,同时排除原有的 ElasticSearch 依赖。

<!-- SpringBoot Web容器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- ElasticSearch 客户端 -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.14.0</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.14.0</version>
</dependency>

<!-- Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<!-- Easy-Es -->
<dependency>
    <groupId>org.dromara.easy-es</groupId>
    <artifactId>easy-es-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# 2. 修改 application.yml,添加 Easy-Es 配置

在 application.yml 文件中添加 Easy-Es 的相关配置,以连接 ElasticSearch 实例并配置索引的刷新策略。

# Easy-Es 配置
easy-es:
  enable: true
  banner: false
  address: 127.0.0.1:9200
  global-config:
    process-index-mode: manual
    db-config:
      refresh-policy: immediate
1
2
3
4
5
6
7
8
9

# 3. 修改 RuoYiApplication 启动类

在 RuoYi 项目的启动类中添加 @EsMapperScan 注解,指定 Easy-Es 的 Mapper 扫描路径。

package com.ruoyi;

import org.dromara.easyes.starter.register.EsMapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

/**
 * 启动程序
 * 
 * @author ruoyi
 */
@EsMapperScan("com.ruoyi.web.controller.search.mapper") // Easy-Es Mapper 扫描路径
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication {
    public static void main(String[] args) {
        SpringApplication.run(RuoYiApplication.class, args);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 4. 修改 SysNoticeMapper.xml

为了便于在插入数据后获取生成的主键 ID,需要修改 SysNoticeMapper.xml 文件中的 insertNotice 节点,添加 useGeneratedKeys 和 keyProperty 属性。

<insert id="insertNotice" parameterType="SysNotice" useGeneratedKeys="true" keyProperty="noticeId">
    <!-- SQL 插入语句 -->
</insert>
1
2
3

# 5. 实现全局搜索功能

接下来,我们需要实现全局搜索功能。在 ruoyi-system 模块中添加 Easy-Es Mapper 和 Service。

# 5.1 创建 SysNoticeEsMapper

在 com.ruoyi.system.mapper 包下创建 SysNoticeEsMapper 接口,继承 Easy-Es 提供的 EsMapper 接口。

package com.ruoyi.system.mapper;

import com.dromara.easyes.core.conditions.interfaces.BaseEsMapper;
import com.ruoyi.system.domain.SysNotice;
import org.springframework.stereotype.Repository;

/**
 * 通知公告 ES Mapper
 */
@Repository
public interface SysNoticeEsMapper extends BaseEsMapper<SysNotice> {
    // 自定义查询或操作方法
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5.2 修改 SysNoticeServiceImpl

在 SysNoticeServiceImpl 中添加对 SysNoticeEsMapper 的调用,以便在插入、更新、删除数据时同步操作 ElasticSearch。

package com.ruoyi.system.service.impl;

import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.mapper.SysNoticeEsMapper;
import com.ruoyi.system.mapper.SysNoticeMapper;
import com.ruoyi.system.service.ISysNoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class SysNoticeServiceImpl implements ISysNoticeService {

    @Autowired
    private SysNoticeMapper noticeMapper;

    @Autowired
    private SysNoticeEsMapper noticeEsMapper;

    @Override
    @Transactional
    public int insertNotice(SysNotice notice) {
        int rows = noticeMapper.insertNotice(notice);
        // 同步到 ES
        noticeEsMapper.insert(notice);
        return rows;
    }

    @Override
    @Transactional
    public int updateNotice(SysNotice notice) {
        int rows = noticeMapper.updateNotice(notice);
        // 同步更新 ES
        noticeEsMapper.updateById(notice);
        return rows;
    }

    @Override
    @Transactional
    public int deleteNoticeByIds(Long[] noticeIds) {
        int rows = noticeMapper.deleteNoticeByIds(noticeIds);
        // 同步删除 ES
        for (Long noticeId : noticeIds) {
            noticeEsMapper.deleteById(noticeId);
        }
        return rows;
    }

    @Override
    public List<SysNotice> searchNotices(String keyword) {
        // 使用 Easy-Es 进行全文检索
        return noticeEsMapper.selectList("noticeTitle", keyword);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# 6. 测试与验证

在启动 ElasticSearch 服务后,运行 RuoYi 项目。通过前端 UI 界面,测试“通知公告”的插入、更新、删除以及全文检索功能,确保它们在 Easy-Es 和 ElasticSearch 的支持下正常工作。

# 7. 重要 API 和参数说明

  • EsMapper:Easy-Es 提供的基础接口,用于对 ElasticSearch 进行操作,类似于 MyBatis-Plus 的 BaseMapper。
  • insert、updateById、deleteById:Easy-Es 提供的基础数据操作方法。
  • selectList:用于执行全文检索,传入字段名称和搜索关键词即可。

::: tipi 总结

通过本文的步骤,已经将 Easy-Es 成功集成到 RuoYi 项目中,实现了分布式全文检索功能。Easy-Es 的 API 与 MyBatis-Plus 一致,开发者可以轻松上手,极大简化了对 ElasticSearch 的操作。如果项目中需要高效的全文检索功能,Easy-Es 是一个非常好的选择。

:::

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
集成 MinIO 实现分布式文件存储
使用 `localStorage` 代替 `cookie`

← 集成 MinIO 实现分布式文件存储 使用 `localStorage` 代替 `cookie`→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式