集成 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>
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
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);
}
}
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>
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> {
// 自定义查询或操作方法
}
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);
}
}
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 是一个非常好的选择。
:::