RuoYi-Vue搜索引擎:Elasticsearch全文检索

RuoYi-Vue搜索引擎:Elasticsearch全文检索

【免费下载链接】RuoYi-Vue :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 【免费下载链接】RuoYi-Vue 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue

在企业级应用开发中,高效的搜索功能是提升用户体验的关键。传统数据库的模糊查询不仅性能低下,还无法满足复杂的检索需求。本文将介绍如何在RuoYi-Vue框架中集成Elasticsearch(弹性搜索)实现全文检索功能,解决海量数据下的快速查询问题。

为什么选择Elasticsearch?

Elasticsearch是一个分布式、RESTful风格的搜索引擎,能够实现近实时的存储、搜索和分析海量数据。与传统数据库相比,它具有以下优势:

  • 全文检索能力:支持分词、同义词、拼写纠错等高级文本处理
  • 高性能:毫秒级响应时间,支持亿级数据量
  • 扩展性:分布式架构,轻松横向扩展
  • 丰富的查询API:支持结构化查询、地理空间查询等多种查询方式

RuoYi-Vue作为一款成熟的前后端分离权限管理系统,集成Elasticsearch后可显著提升系统的搜索体验,满足企业级应用对数据检索的高级需求。

系统架构与搜索流程

RuoYi-Vue集成Elasticsearch的架构主要包含以下几个部分:

mermaid

核心模块路径

实现步骤

1. 环境准备与依赖配置

首先需要在项目中添加Elasticsearch相关依赖。在pom.xml中加入以下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2. 配置Elasticsearch连接

application.yml中添加Elasticsearch配置:

spring:
  elasticsearch:
    rest:
      uris: http://localhost:9200
      connection-timeout: 1s
      read-timeout: 3s

3. 创建搜索实体类

以用户搜索为例,创建对应的Elasticsearch文档实体:

@Document(indexName = "sys_user")
public class UserDocument {
    @Id
    private Long userId;
    private String userName;
    private String nickName;
    private String email;
    private String phonenumber;
    private String deptName;
    // getter和setter方法
}

4. 创建Repository接口

public interface UserRepository extends ElasticsearchRepository<UserDocument, Long> {
    // 简单查询方法
    List<UserDocument> findByUserNameContainingOrNickNameContaining(String userName, String nickName);
    
    // 自定义查询
    @Query("{\"multi_match\": {\"query\": \"?0\", \"fields\": [\"userName^3\", \"nickName^2\", \"email\", \"phonenumber\"]}}")
    Page<UserDocument> searchUser(String keyword, Pageable pageable);
}

5. 实现搜索服务

@Service
public class SearchServiceImpl implements ISearchService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private ISysUserService userService;
    
    @Override
    public Page<UserDocument> searchUsers(String keyword, int pageNum, int pageSize) {
        Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.by("userId").descending());
        return userRepository.searchUser(keyword, pageable);
    }
    
    @Override
    public void syncUserToEs(Long userId) {
        SysUser user = userService.selectUserById(userId);
        if (user != null) {
            UserDocument doc = convertToDocument(user);
            userRepository.save(doc);
        }
    }
    
    // 实体转换方法
    private UserDocument convertToDocument(SysUser user) {
        UserDocument doc = new UserDocument();
        doc.setUserId(user.getUserId());
        doc.setUserName(user.getUserName());
        doc.setNickName(user.getNickName());
        doc.setEmail(user.getEmail());
        doc.setPhonenumber(user.getPhonenumber());
        doc.setDeptName(user.getDept().getDeptName());
        return doc;
    }
}

5. 前端搜索组件实现

HeaderSearch/index.vue中实现搜索框和结果展示:

<template>
  <div class="header-search">
    <el-input
      v-model="keyword"
      placeholder="搜索用户、菜单、角色..."
      @keyup.enter.native="handleSearch"
    >
      <i slot="prefix" class="el-icon-search"></i>
    </el-input>
    
    <el-dropdown v-if="showResult" placement="bottom-start">
      <el-button type="text" class="search-result-trigger">
        <span class="sr-only">搜索结果</span>
      </el-button>
      <el-dropdown-menu slot="dropdown" class="search-result-dropdown">
        <div v-for="user in userResults" :key="user.userId" class="search-result-item">
          <div class="result-title">{{ user.userName }}</div>
          <div class="result-desc">{{ user.nickName }} - {{ user.deptName }}</div>
        </div>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
export default {
  data() {
    return {
      keyword: '',
      showResult: false,
      userResults: []
    }
  },
  methods: {
    handleSearch() {
      if (this.keyword.length < 2) {
        return;
      }
      this.$api.search.searchUsers(this.keyword).then(response => {
        this.userResults = response.data.records;
        this.showResult = this.userResults.length > 0;
      });
    }
  }
}
</script>

搜索功能优化

1. 索引优化

  • 为常用搜索字段设置合适的权重
  • 使用ik分词器提高中文分词效果
  • 定期重建索引保持数据一致性

2. 查询优化

  • 使用复合查询提高准确率
  • 实现搜索结果高亮显示
  • 添加搜索建议和自动补全功能

3. 性能优化

  • 实现搜索结果缓存
  • 使用异步方式同步数据到Elasticsearch
  • 对大量数据实现分批索引

搜索功能界面展示

RuoYi-Vue系统中的搜索功能入口位于顶部导航栏,用户可以通过搜索框快速查找系统中的用户、菜单、角色等信息:

搜索框入口

搜索结果展示界面:

搜索结果展示

总结与展望

通过集成Elasticsearch,RuoYi-Vue系统实现了高效的全文检索功能,大大提升了用户在海量数据中的信息获取效率。未来可以进一步扩展搜索范围,优化搜索算法,实现更智能的搜索推荐功能。

官方文档:doc/若依环境使用手册.docx 项目源码:ruoyi-ui/src/components/HeaderSearch/index.vue

【免费下载链接】RuoYi-Vue :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 【免费下载链接】RuoYi-Vue 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值