简介
为什么要是用Easy-es
在开发的过程中,目前有原生的es的依赖,以及springboot整合es依赖可以使用,但是对于复杂的es查询场景,编写起来会比较麻烦,而Easy-es就是为了让我们编写变得更加的"easy"从而诞生的,本人在实际场景中使用。
类比于mybatis与Mybatis-plus,Mybatis-plus的封装,让我们编写查询方法更加的便捷。
官方解释
Easy-es,类似于mybatisplus,是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生
具体的不讲太多,主要是讲应用,详细的可以看看官网
Springboot整合Easy-es
背景案例
有个告警表、其中有字段id、主题、时间、设备号
引入依赖
<!-- 引入easy-es最新版本的依赖-->
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<!--这里Latest Version是指最新版本的依赖,比如2.0.0,可以通过下面的图片获取-->
<version>2.0.0</version>
</dependency>
<!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.0</version>
</dependency>
yaml配置
easy-es:
enable: true #默认为true,若为false则认为不启用本框架
address : 127.0.0.1:19200 # es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200
username: elastic #若无 则可省略此行配置
password: elastic #若无 则可省略此行配置
# 日志配置 可以查看DSL,方便验证
logging:
level:
tracer: trace # 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及DSL语句,为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.
- 至于es的安全配置(账号密码)等可以查看往期文章
https://mp.weixin.qq.com/s/e-JgJeOLwsJGxlYGlnnnNw?token=642004887&lang=zh_CN
创建索引类/实体类
一般是在我们的数据库的实体类中使用即可
package com.walker.es.model;
import lombok.Data;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.Settings;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldType;
@Data
//索引名、别名
@IndexName(value = "alarm_record",aliasName = "alarm")
//可配置索引分片数、索引副本数、默认最大返回数、索引的刷新间隔
//也可以自定义settings提供类 默认为DefaultSettingsProvider空实现 如需自定义,可继承此类并覆写getSettings方法 将settings信息以Map返回
@Settings(shardsNum = 2, replicasNum = 2)
public class AlarmRecordEntity {
// 需要使用多一个id,用于标识es的id,不要跟数据库的id 混在一起,否则会无法搜索出id
@IndexId
private String esId;
// 数据库的主键id,建议与es的自动生成的id分开,命名的时候也不要取id,否则在搜索的时候会搜索不出
// 如果使用keyword和string 排序的时候 会第一个数字大的排前面,也就是9会排前面 这是有问题的
// 因此 如果数据库id的字段使用String的时候 fieldType可以使用Long
// 如果使用Long类型,则使用keyword则meiwenti
@IndexField(value = "sqlId",fieldType = FieldType.KEYWORD)
private Long sqlId;
// 需要对类型为text或keyword_tex字段聚合时,可指定其fieldData=true,否则es会报错
// 中文分词器 analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD
@IndexField(fieldType = FieldType.TEXT,fieldData = true, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD )
private String titile;
// 日期类型
@IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
private String time;
@IndexField(fieldType = FieldType.KEYWORD)
private String deviceCode;
// 忽略字段
@IndexField(exist = false)
private String msg;
}
这里需要注意的是sqlId的类型选择
如果选择是String,然后使用的是雪花id或者自增id,fieldType则要使用Long或者Integer类型,不能选择keyword,否则可能会导致排序出现问题
选择Long类型的话,使用keyword就没什么问题
数据库主键id注意事项:
建议不要使用id,因为作者的id,一般用于es的_id绑定一起,如果使用了,可能会导致查询id的时候无法查出数据等
如果要使用的话,得修改作者的源码部分才可。因此还是建议修改个名称万事平安了。
接口编写与测试
基础controller如下:
package com.walker.es.controller;
import com.walker.es.esmapper.AlarmRecordMapper;
import com.walker.es.model.AlarmRecordEntity;
import com.walker.es.model.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.