开发喵星球

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

Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发。

1、ES的优点

到目前为止,针对亿级,百亿级,千亿级数据的存储检索,处理ES和ES同类产品,还没有其它的数据库能够做到秒级别的返回。

2、整合过程

(1)配置文件

tips:easy-es.address如果是ip地址就用ip+端口号,是公网地址就用公网域名+端口号在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万

(2)引入依赖

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

(3) 创建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;

/**
 * @author Administrator
 */
@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接口

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("com.ruoyi.es.mapper")

(6)创建测试方法

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)初始化数据

(2)ES里面数据展示

(3)分页查询

可以看到,查询速度是非常快的。

更多Easy-Es相关用法,请参考官方提供的在线文档。
Easy-Es在线文档地址:https://www.easy-es.cn/

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-01-08 20:43:10 阅读量:215
<<   >>


powered by kaifamiao