Bootstrap

EasyElasticsearch

依赖

<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那篇文章,这也是你要想成为一名及格架构师的第一步。

;