Easy-Es
(简称 EE)是一个基于 ElasticSearch
(简称 Es) 官方提供的 RestHighLevelClient
开发的 ORM
框架。它是在 RestHighLevelClient
的基础上进行增强,而不改变原有功能。Easy-Es
的设计初衷是简化开发过程并提高开发效率。如果你曾使用过 Mybatis-Plus
(简称 MP),那么你几乎可以零学习成本直接上手 EE
。Easy-Es
是 MP
在 Es
中的替代版,在某些方面甚至比 MP
更简单,并且融合了更多 Es
特有的功能,助你快速实现各种开发场景。
目前为止,ElasticSearch
是处理亿级、百亿级甚至千亿级数据存储、检索的最佳解决方案之一。它能够在秒级别内返回查询结果,这在现有的数据库技术中是无与伦比的。
首先,我们需要在 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 万
在项目的 pom.xml
文件中引入 Easy-Es 依赖:
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
接下来,需要创建一个实体类,用于表示 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;
}
接下来,定义一个接口来管理 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> {
}
在 RuoYiApplication.java
类中添加 @EsMapperScan
注解,用于扫描 Mapper 接口。
@EsMapperScan("com.ruoyi.es.mapper")
最后,在控制器中编写一些测试方法,测试 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;
}
}
在这里,我们通过初始化 10000 条测试数据来验证接口的性能。
通过 GET /es/insert
接口初始化数据,并成功插入 10000 条文章记录。
可以通过 ElasticSearch 的管理工具查看已经插入的数据,并进行相关的查询测试。
使用 GET /es/search
接口进行分页查询测试,可以看到查询速度非常快。
通过整合 Easy-Es,若依系统能够高效地进行大规模数据的查询和处理。如果想了解更多 Easy-Es 的功能和使用方式,请参考 Easy-Es 官方文档。
powered by kaifamiao