拉取代码
git拉取 yxh-elasticsearch: es基本封装工具
拉完修改
你可以根据自己去修改这些代码,最后install加package,就打到了本地maven仓库,调用的时候也非常方便,可以看下文。
介绍
注解
一共有三个自定义注解
@DocumentIndex
作用
一共四个字段,indexName是用于你在实体类上,可直接声明该实体类所对应的ES文档名,可自定义文档名称
maxSize 可以设置最大数据量一般都是设置亿级以上,我这边少打了几个0,因为ES所使用的场景一般都是数据量极大的。
shards 设置分片
replicas 设置副本,也就是备份
以上这些都可以自行设置
@IdIndex
由于这个石墨文档企业版需要续费3000块大洋,贵死了,导致没办法上传图片了,接下来直接看代码解析吧
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IdIndex {
}
作用
该注解作用其实就是标识一下该字段为主键,就跟Mybatis-plus一样,都需要表示一下主键,毕竟你大部分CRUD操作涉及到主键,所以我们当然是需要标识一下了。
很简单,直接标识在主键字段上就OK了。
底层很简单无非就是识别一下该类是否有标识该注解,如果有就会通过映射的关系,将该字段设置为主键,想了解ES的主键这段有什么用,可以往上翻翻 实体类 需加注解 这个模块
/**
* 创建ID
* */
private String getObjectId(Object data){
String idValue = null;
try {
Field[] fields = data.getClass().getDeclaredFields();
for (Field field : fields) {
IdIndex annotation = field.getAnnotation(IdIndex.class);
if (null != annotation){
field.setAccessible(true);
idValue = field.get(data).toString();
break;
}
}
} catch (Exception e){
log.error("报错信息:{}",e);
}
return idValue;
}
@PropertiesIndex
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PropertiesIndex {
String name() default ""; //类型名称
String type() default "keyword"; //类型
String analyzer() default "ik_smart"; //分片
boolean index() default true; //是否建立索引
String searchAnalyzer() default "ik_smart"; //查询分片
boolean ignore() default true; //是否创建索引
}
该注解就得好好讲讲了
作用
name()
也就是你可以更改该字段在ES中字段名称,如图中③
@PropertiesIndex(name = "clazzName",type = "char")//定义存入es的字段名 和 字段类型
private String clazzName;
我的字段是clazzName,但是,我可以在该注解中设置name=“name”或者 name=“cname”,我可以叫任何字段名,相当于在同步到ES中,字段名称更换了。
type()
type就是该字段的类型,先讲讲场景: 好比我该字段类型数据库时是decimal而我的实体类是不是就要用BigDecimal,但是我ES中,不想用这个字段,我是不是可以设置为double或者int类型,这个时候我加上type="int" 或者 type="double" ,随后你在同步ES的时候该字段类型就是你type的标识的类型。
总结
剩下几个字段都是默认值,自己可以设置,基本都可以自己去看一看,玩一玩,所有的类型字段都是跟原ES类型是一致的,每个注解都有对应的作用,主要是要加上@DocumentIndex该注解是必须加的。我这一套注解你会发现跟mybatis-plus和easy-es是差不多的,所以,我们可以学以致用一下,在后面自己封装一些工具类和接口,都已用这类方法,注解就用这几个可以吃遍天下。
使用方法
依赖
<dependency>
<groupId>com.yxh</groupId>
<artifactId>yxh-elasticsearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
这是你打包完,下载到本地maven仓库后,在别的工程中调用,可以方便许多。
实现接口
service.impl层
@Service
public class StuServiceImpl extends YxhEsServiceImpl<Stu> implements StuService
这段代码是不是赔偿熟悉,跟继承mybatis-plus是不是一模一样,通过继承的方式继承封装好的YxhEsServiceImpl实现类,可直接调用,由于该工具底层我采用是跟用<T>泛型来标识,所以实现的时候也必须加上你的实体类类型
可以直接通过this.方法就可以调用了。
mapper层
@Component
public interface StuMappers extends YxhEsService<Stu> {
}
mapper层直接通过继承的方式继承YxhEsService这个接口,来实现。
上面为什么要加@Component呢?
首先我们这个工程师spring工程吧,需要spring来管理,我们就需要加上spring的注解,才能识别到,否则会报null异常,或则是找不到这个类,无法实例之类的错。
第二,就是我们一般都是把mapper放在mapper层,但是我们的mapper层在启动类已经加上了@MapperScan("com.yxh.mapper")这个注解,它管理着整个mapper层的类,因为这个是扫描mybatis的,一旦被管理了,他会扫描你该类里面是否用到mybatis,没用的话,还是会报错,所以我们加一个@Component注解就标识了,该类只是被spring管理了而已。
总结:
自己封装的es肯定没有人家大公司封装的来的强,但是自己封装主要是为了提高对代码底层的了解,以及对各种自定义注解的了解,提高自己的代码思维能力。如果自己玩的话,已通过执行封装,自己根据自己常用的操作习惯来封装,提高开发效率,或者在企业当中,通过封装也能提高企业开发效率,当然这种活都是架构师来干的,就当自己玩玩,以及在面试的时候,能讲出东西来,OK了程序猿们,该下班了。
标签:mapper,封装,String,复用,Elasticsearch,注解,type,ES From: https://blog.csdn.net/yxhsk8/article/details/142632905