Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发。
到目前为止,针对亿级,百亿级,千亿级数据的存储检索,处理ES和ES同类产品,还没有其它的数据库能够做到秒级别的返回。
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万
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
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;
}
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("com.ruoyi.es.mapper")
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条测试数据,来测试一下接口。
可以看到,查询速度是非常快的。
更多Easy-Es相关用法,请参考官方提供的在线文档。
Easy-Es在线文档地址:https://www.easy-es.cn/
powered by kaifamiao