开发喵星球

若依整合Easy-Es实现文章列表分页查询(248)

需求提出

Easy-Es 整合到若依管理系统中,实现文章列表的分页查询,以利用 ElasticSearch 的强大检索能力,提升系统的查询性能。

相关介绍

Easy-Es(简称 EE)是一个基于 ElasticSearch 官方提供的 RestHighLevelClient 打造的 ORM 开发框架,旨在简化开发、提高效率。它与 Mybatis-Plus(简称 MP)类似,提供了类似的 API 和使用体验,适合有 MP 使用经验的开发者快速上手。

解决思路

  1. application.yml 文件中添加 `Easy-Es“ 的配置。
  2. 引入 Easy-Es 的依赖。
  3. 创建 ES 索引实体类。
  4. 创建 Mapper 接口。
  5. 在启动类中添加 Mapper 扫描注解。
  6. 创建测试控制器,实现数据初始化和分页查询接口。

所需技术

项目结构

ruoyi-framework
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── ruoyi
│   │   │           ├── es
│   │   │           │   ├── domain
│   │   │           │   │   └── EsArticle.java
│   │   │           │   ├── mapper
│   │   │           │   │   └── DocumentMapper.java
│   │   │           └── blog
│   │   │               └── controller
│   │   │                   └── EsController.java
│   │   ├── resources
│   │   │   └── application.yml
├── pom.xml

注意事项

  1. 确保 ElasticSearch 服务已启动,并且可以通过配置文件中的地址和端口访问。
  2. 确保所有依赖版本兼容。
  3. 修改代码时注意路径和文件名的准确性。

完整代码

第一步: 在 application.yml 文件中添加 Easy-Es 的配置

# easy-es
easy-es:
  enable: true # 是否开启EE自动配置
  address: es-na9iqtzt.public.tencentelasticsearch.com:9200 # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
  schema: https # 默认为http
  username: elastic #如果无账号密码则可不配置此行
  password: 你的密码 #如果无账号密码则可不配置此行
  banner: true # 默认为true 打印banner 若您不期望打印banner,可配置为false
  global-config:
    process-index-mode: smoothly #索引处理模式,smoothly:平滑模式,默认开启此模式, not_smoothly:非平滑模式, manual:手动模式
    print-dsl: true # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
    distributed: false # 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.
    async-process-index-blocking: true # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快
    active-release-index-max-retry: 60 # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数若数据量过大,重建索引数据迁移时间超过60*(180/60)=180分钟时,可调大此参数值,此参数值决定最大重试次数,超出此次数后仍未成功,则终止重试并记录异常日志
    active-release-index-fixed-delay: 180 # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数 若数据量过大,重建索引数据迁移时间超过60*(180/60)=180分钟时,可调大此参数值 此参数值决定多久重试一次 单位:秒
    db-config:
      map-underscore-to-camel-case: false # 是否开启下划线转驼峰 默认为false
      table-prefix: daily_ # 索引前缀,可用于区分环境  默认为空 用法和MP一样
      id-type: customize # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成
      field-strategy: not_empty # 字段更新策略 默认为not_null
      enable-track-total-hits: true # 默认开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响,若查询数量突破1W条时,需要同步调整@IndexName注解中的maxResultWindow也大于1w,并重建索引后方可在后续查询中生效(不推荐,建议分页查询).
      refresh-policy: immediate # 数据刷新策略,默认为不刷新
      enable-must2-filter: false # 是否全局开启must查询类型转换为filter查询类型 默认为false不转换
      batch-update-threshold: 10000 # 批量更新阈值 默认值为1万

第二步: 引入 Easy-Es 的依赖

pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>cn.easy-es</groupId>
    <artifactId>easy-es-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>

第三步: 创建 ES 索引实体类

com.ruoyi.es.domain 包中创建 EsArticle.java 文件:

package com.ruoyi.es.domain;

import cn.easyes.annotation.IndexField;
import cn.easyes.annotation.IndexId;
import cn.easyes.annotation.IndexName;
import cn.easyes.annotation.rely.Analyzer;
import cn.easyes.annotation.rely.FieldType;
import cn.easyes.annotation.rely.IdType;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.util.Date;

@Data
@EqualsAndHashCode
@IndexName(value = "es_article")
public class EsArticle implements Serializable {
    @IndexId(type = IdType.CUSTOMIZE)
    private String id;

    @IndexField(fieldType = FieldType.KEYWORD)
    private Long articleId;

    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
    private String title;

    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
    private String categoryName;

    @IndexField(fieldType = FieldType.KEYWORD)
    private Long readNum;

    @IndexField(fieldType = FieldType.KEYWORD)
    private Long likeNum;

    @IndexField(fieldType = FieldType.KEYWORD)
    private Long commentNum;

    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
    private String summary;

    @IndexField(fieldType = FieldType.KEYWORD)
    private String picture;

    @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
    private Date createTime;
}

第四步: 创建 Mapper 接口

com.ruoyi.es.mapper 包中创建 DocumentMapper.java 文件:

package com.ruoyi.es.mapper;

import cn.easyes.core.conditions.interfaces.BaseEsMapper;
import com.ruoyi.es.domain.EsArticle;

public interface DocumentMapper extends BaseEsMapper<EsArticle> {
}

第五步: 在启动类中添加 Mapper 扫描注解

RuoYiApplication.java 类上添加以下注解:

@EsMapperScan("com.ruoyi.es.mapper")

第六步: 创建测试控制器

com.ruoyi.blog.controller 包中创建 EsController.java 文件:

package com.ruoyi.blog.controller;

import cn.easyes.core.biz.EsPageInfo;
import cn.easyes.core.conditions.LambdaEsQueryWrapper;
import com.ruoyi.cms.domain.Article;
import com.ruoyi.cms.service.IArticleService;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.es.domain.EsArticle;
import com.ruoyi.es.mapper.DocumentMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试使用Easy-ES
 **/
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class EsController {

    private final DocumentMapper documentMapper;

    private final IArticleService articleService;

    /**
     * 初始化数据
     * @param n
     * @return
     */
    @GetMapping("/es/insert")
    public Integer insert(int n) {
        List<Article> articles = articleService.selectRssArticleList(n);
        List<EsArticle> esArticleList = new ArrayList<>();
        articles.forEach(item -> {
            EsArticle esArticle = new EsArticle();
            esArticle.setId(String.valueOf(item.getArticleId()));
            BeanUtils.copyProperties(item, esArticle);
            esArticleList.add(esArticle);
        });
        documentMapper.insertBatch(esArticleList);
        return esArticleList.size();
    }

    /**
     * 搜索接口
     * @param kw  搜索关键词
     * @param page 页码
     * @return
     */
    @GetMapping("/es/search")
    public EsPageInfo<EsArticle> search(String kw, Integer page) {
        LambdaEsQueryWrapper<EsArticle> wrapper = new LambdaEsQueryWrapper<>();
        wrapper.like(EsArticle::getTitle, kw);
        wrapper.or();
        wrapper.like(EsArticle::getSummary, kw);
        EsPageInfo<EsArticle> documentEsPageInfo = documentMapper.pageQuery(wrapper, page, 10);
        return documentEsPageInfo;
    }
}

运行结果

  1. 编译和打包项目
    mvn clean install
    
  2. 启动项目
    java -jar target/ruoyi-framework.jar
    
  3. 初始化数据
    • 访问 http://localhost:8080/es/insert?n=10000 初始化 10000 条测试数据。
  4. 分页查询
    • 访问 http://localhost:8080/es/search?kw=关键词&page=1 进行分页查询,结果会显示匹配的文章列表。

总结

通过上述步骤,我们成功地将 Easy-Es 整合到若依管理系统中,实现了文章列表的分页查询。利用 ElasticSearch 的强大检索能力和 Easy-Es 的简化开发体验,系统的查询性能得到了显著提升。更多 Easy-Es 的用法请参考官方文档:https://www.easy-es.cn/

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-06-22 03:03:10 阅读量:280
<<   >>


powered by kaifamiao