依赖
<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>
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>2.0.0-beta1</version>
</dependency>
配置文件
easy-es:
enable: true
address: IP地址:9200
global-config:
process_index_mode: manual
上代码
启动类 必加
@EsMapperScan("com.yxh.mapper")
如果你使用的时候已经加入了@MapperScan()该注解 还是需要加上@EsMapperScan()
否者会无法识别到该类
导致报错
Mapper层
继承BaseEsMapper<实体类>,看着是不是跟MyBatisplus的BaseMapper<实体类>极其相似,这两个封装的原理都是一样的,都是人家在后台封装好的东西,打成jar包放在远程仓库,方便程序猿们随时调用,简洁大家的开发效率
public interface EsMapper extends BaseEsMapper<实体类> {}
实体类 需加注解
@IndexName("索引名")
@IndexId(type = cn.easyes.annotation.rely.IdType.CUSTOMIZE)
@IndexName 是用于扫描索引名 或 创建索引名
@IndexId(type = IdType.CUSTOMIZE) 是用于标注该类主键
看使用与不使用的效果
前言
先讲解一下 "_id" 相当于es文档的一个唯一索引值,跟你的数据库的唯一键一样的。
不标识
可以看到在不标识的情况下,添加进去的"_id"是随机生成的乱码,实际上是es文档生成的唯一键
标识
可以看出表示以后,"_id" 成了你添加进的id一致,这样就可以方便的后续的CRUD操作了。
总结
es文档大部分操作都是由该 "_id" 进行操作,所以个这个id必须要唯一,毕竟咱是要简洁开发不可能先查询出id值是什么再去做CRUD,所以尽量将id跟数据库一致,这样方便对数据进行管理
注入注解
创建索引
@Override
public String createIndex() {
String indexName = User.class.getSimpleName().toLowerCase(); //获取该类名 转成小写 User -> user
boolean existsIndex = esMapper.existsIndex(indexName);
if (existsIndex){ //存在则删除索引
esMapper.deleteIndex(indexName);
log.error("索引已存在,删除索引");
}
boolean success = esMapper.createIndex(); //创建索引
if (success){
log.info("索引创建成功");
}else {
log.info("索引创建失败");
}
return log.toString();
}
添加
单条数据添加
@Override
public void insert(User user) {
esMapper.insert(user);
}
批量添加
@Override
public void insertBatch() {
List<User> list = userMapper.selectList(null);//获取数据
esMapper.insertBatch(list); //插入es文档
}
修改
修改单条数据
@Override
public void update(User user) {
esMapper.updateById(user);
}
批量修改
@Override
public void updateBatch(List<User> user) {
esMapper.updateBatchByIds(user);
}
删除
单删
@Override
public void deleteById(Integer userId) {
esMapper.deleteById(userId);
}
批量删除
@Override
public void deleteBatch(List<Integer> user) {
esMapper.deleteBatchIds(user);
}
查询
根据主键ID查询
@Override
public User findById(String userId) {
return esMapper.selectById(userId);
}
列表查询
查询所有
@Override
public List<User> selectList(UserQuarry quarry) {
return esMapper.selectList(null);
}
查询所有就不用传任何的参数,当然,即便需要条件查询也依旧很简单,因为他跟MyBatisplus一样都为我们提供了
LambdaEsQueryWrapper<User> wrapper = new LambdaEsQueryWrapper<>();
精确查询
@Override public List<User> selectList(UserQuarry quarry) { LambdaEsQueryWrapper<User> wrapper = new LambdaEsQueryWrapper<>(); wrapper.eq(User::getUserName,quarry.getUsername()); return esMapper.selectList(wrapper); }
wrapper里面,为我们提供了各种sql以及条件查询的给类方法,对应的都是sql条件查询的方法,直接调用,自己可以多玩玩看。
高亮
官网讲述到,想要使用高亮可以用这个注解
@HighLight(mappingField = "highContent",preTag = "<span style=\"red;\">",postTag = "</span>")
但实际上就算加了这个注解一不好使,我也不知道到底是因为什么原因,你们可以自己权研究一下,同样,我们换个思维,高亮不就是你传入的参数值吗,那我们就将传入的参数值,拿出来,给他加上个样式重新赋值不就可以了,可以是使用一下我这种比较随意大方法。
@Override
public List<User> selectList(UserQuarry quarry) {
LambdaEsQueryWrapper<User> wrapper = new LambdaEsQueryWrapper<>();
if (!StringUtil.isBlank(quarry.getUsername())){
wrapper.like(User::getUserName, quarry.getUsername());
}
List<User> list = esMapper.selectList(wrapper);
list.forEach(user -> {
user.setHighContent("<span style=\"red;\">"+quarry.getUsername()+"</span>");
});
return list;
}
总结
easy-es其实就跟mybatis-plus一样,都是为了简化我们的工作而封装出来的,同样也可以上easy-es官网学习更多查询方法,还有肯定很多小伙伴关心,这个包里面有没有高亮查询啊,easy-es官网上确实有钢梁查询的方法,用一个注解,但实际上一点用都没有,我来回测了好几次,我在想是我传参有问题还是因为注解定义的不对,好像确实就是没有,不好使。
最后,要是自己也想封装一个这样的工具包,可以看看我主页里的封装es那篇文章,这也是你要想成为一名及格架构师的第一步。