开发喵星球

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

Easy-Es(简称 EE)是一个基于 ElasticSearch (简称 Es) 官方提供的 RestHighLevelClient开发的 ORM 框架。它是在 RestHighLevelClient 的基础上进行增强,而不改变原有功能。Easy-Es 的设计初衷是简化开发过程并提高开发效率。如果你曾使用过 Mybatis-Plus (简称 MP),那么你几乎可以零学习成本直接上手 EEEasy-EsMPEs 中的替代版,在某些方面甚至比 MP 更简单,并且融合了更多 Es 特有的功能,助你快速实现各种开发场景。

1、ElasticSearch 的优势

目前为止,ElasticSearch 是处理亿级、百亿级甚至千亿级数据存储、检索的最佳解决方案之一。它能够在秒级别内返回查询结果,这在现有的数据库技术中是无与伦比的。

2、整合过程

(1)配置文件

首先,我们需要在 application.yml 文件中配置 Easy-Es 的相关信息。如果使用的是 IP 地址,请使用 ip:port 的格式;如果使用的是公网地址,则使用 域名:端口号 的格式。

# easy-es配置
easy-es:
  enable: true  # 是否开启 Easy-Es 自动配置
  address: es-na9iqtzt.public.tencentelasticsearch.com:9200  # Es 的连接地址和端口
  schema: https  # 默认为 http,可以改为 https
  username: elastic  # 如果有账号密码,请配置此行
  password: 你的密码  # 如果有账号密码,请配置此行
  banner: true  # 默认打印 Easy-Es 启动 banner,若不想打印可设置为 false
  global-config:
    process-index-mode: smoothly  # 索引处理模式,默认平滑模式
    print-dsl: true  # 控制台是否打印由框架生成的 DSL 语句,生产环境建议关闭以提升性能
    distributed: false  # 当前项目是否为分布式项目,默认为 true
    async-process-index-blocking: true  # 异步处理索引时是否阻塞主线程,默认阻塞
    active-release-index-max-retry: 60  # 分布式环境下的最大重试次数
    active-release-index-fixed-delay: 180  # 分布式环境下的重试间隔,单位为秒
    db-config:
      map-underscore-to-camel-case: false  # 是否开启下划线转驼峰,默认为 false
      table-prefix: daily_  # 索引前缀,默认为空
      id-type: customize  # ID 生成策略,默认使用用户自定义 ID
      field-strategy: not_empty  # 字段更新策略,默认为 not_null
      enable-track-total-hits: true  # 开启后可查询所有匹配数据
      refresh-policy: immediate  # 数据刷新策略,默认为不刷新
      enable-must2-filter: false  # 全局是否将 must 查询转换为 filter 查询
      batch-update-threshold: 10000  # 批量更新阈值,默认为 1 万

(2)引入依赖

在项目的 pom.xml 文件中引入 Easy-Es 依赖:

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

(3)创建 ES 索引实体类

接下来,需要创建一个实体类,用于表示 ES 中的文章索引。

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 {
    /**
     * ES 中的唯一 ID
     */
    @IndexId(type = IdType.CUSTOMIZE)
    private String id;

    /**
     * 文章 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;
}

(4)创建 Mapper 接口

接下来,定义一个接口来管理 ES 索引的操作。

package com.ruoyi.es.mapper;

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

public interface DocumentMapper extends BaseEsMapper<EsArticle> {
}

(5)扫描 Mapper 接口

RuoYiApplication.java 类中添加 @EsMapperScan 注解,用于扫描 Mapper 接口。

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

(6)创建测试方法

最后,在控制器中编写一些测试方法,测试 Easy-Es 的功能。

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;
    }
}

3、接口调用测试

在这里,我们通过初始化 10000 条测试数据来验证接口的性能。

(1)初始化数据

通过 GET /es/insert 接口初始化数据,并成功插入 10000 条文章记录。

(2)在 ES 中查看数据

可以通过 ElasticSearch 的管理工具查看已经插入的数据,并进行相关的查询测试。

(3)分页查询

使用 GET /es/search 接口进行分页查询测试,可以看到查询速度非常快。

通过整合 Easy-Es,若依系统能够高效地进行大规模数据的查询和处理。如果想了解更多 Easy-Es 的功能和使用方式,请参考 Easy-Es 官方文档

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-08-15 11:03:07 阅读量:146
<<   >>


powered by kaifamiao