搜索引擎大家都不陌生,比如百度、360我们搜索一段文字,就可以搜索出来一些内容,这些内容就是根据我们的关键字,从搜索里面搜索出来的。

应用场景:

1.检索类服务

  • 搜索文库
  • 电商商品检索
  • 海量系统日志检索

2.问答类服务(本质上也是检索类)

  • 在线智能客服
  • 机器人

3.地图类服务

  • 打车app
  • 外卖app
  • 社区团购配送
  • 陌生人社交

官网地址:https://easy-es.cn/#/
在这里插入图片描述

简介

Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的低码开发框架,在RestHighLevelClient的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.

  • 理念 把简单,易用,方便留给用户,把复杂留给框架.
  • 愿景 让天下没有难用的Es,致力于成为全球最受欢迎的ElasticSearch搜索引擎开发框架.

优势

  • 屏蔽语言差异:开发者只需要会MySQL语法即可使用Es,真正做到一通百通,无需学习枯燥易忘的Es语法,Es使用相对MySQL较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜
  • 代码量极少: 与直接使用RestHighLevelClient相比,相同的查询平均可以节省3-5倍左右的代码量
  • 零魔法值:字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的Bug
  • 零额外学习成本:开发者只要会国内最受欢迎的Mybatis-Plus语法,即可无缝迁移至EE,EE采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽
  • 降低开发者门槛:Es通常需要中高级开发者才能驾驭,但通过接入EE,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发,可以提高人员利用率,降低企业成本特性
  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper,仅仅通过少量配置即可实现大部分 CRUD操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段
  • 支持主键自动生成:支持2 种主键策略,可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置分页插件:基于RestHighLevelClient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 List查询,且保持和PageHelper插件同样的分页返回字段,无需担心命名影响
  • MySQL功能全覆盖:MySQL中支持的功能通过EE都可以轻松实现 支持ES高阶语法:支持高亮搜索,分词查询,权重查询,聚合查询等高阶语法
  • 良好的拓展性:底层仍使用RestHighLevelClient,可保持其拓展性,开发者在使用EE的同时,仍可使用RestHighLevelClient的功能

框架结构

在这里插入图片描述
在这里插入图片描述

开始使用

0.先安装elasticsearch
在这里插入图片描述
在这里插入图片描述
1.导入依赖到pom.xml

<dependency>
   <groupId>io.github.xpc1024</groupId>
   <artifactId>easy-es-boot-starter</artifactId>
   <version>0.9.6</version>
</dependency>

2.application.yml中配置ES的访问地址和用户名及其密码

easy-es:
  enable: true # 默认为true,若为false,则认为不启用本框架
  address : 127.0.0.0:9200  #填你的es连接地址
  # username: 有设置才填写,非必须
  # password: 有设置才填写,非必须

3.创建实体类,与ES中索引做关联
在这里插入图片描述

package com.example.demo.entity;

import com.xpc.easyes.core.anno.TableField;
import com.xpc.easyes.core.anno.TableId;
import com.xpc.easyes.core.anno.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    /**
     * id
     */
    @TableId
    private Integer id;
    /**
     * 名字
     */
    @TableField
    private String name;
    /**
     * 年龄
     */
    @TableField
    private Integer age;
    /**
     * 家庭地址
     */
    @TableField
    private String address;
    /**
     * 学校
     */
    @TableField
    private String school;
    /**
     * 手机号码
     */
    @TableField
    private String phone;
    /**
     * 身高
     */
    @TableField
    private String height;
    /**
     * 体重
     */
    @TableField
    private String weight;
    /**
     * 父亲
     */
    @TableField
    private String father;
    /**
     * 母亲
      */
    @TableField
    private String mather;
}

4.创建一个mapper,与实体类关联,内部含有丰富的操作接口
在这里插入图片描述

package com.example.demo.mapper;

import com.example.demo.entity.User;
import com.xpc.easyes.core.conditions.interfaces.BaseEsMapper;
import org.springframework.stereotype.Component;

@Component
public interface UserMapper extends BaseEsMapper<User> {
}

5.创建controller层,使用丰富的接口
在这里插入图片描述
5.1 先创建索引

/**
 * 创建index
 * @return
 */
@GetMapping("/createIndex")
public Object createIndex(){

    LambdaEsIndexWrapper<User> wrapper = new LambdaEsIndexWrapper<>();
    // 此处简单起见 索引名称须保持和实体类名称一致,字母小写 后面章节会教大家更如何灵活配置和使用索引
    wrapper.indexName(User.class.getSimpleName().toLowerCase());

    // 此处将文章标题映射为keyword类型(不支持分词),文档内容映射为text类型,可缺省
    // 支持分词查询,内容分词器可指定,查询分词器也可指定,,均可缺省或只指定其中之一,不指定则为ES默认分词器(standard)
    wrapper.mapping(User::getAddress, FieldType.KEYWORD, Analyzer.IK_MAX_WORD);
    // 设置分片及副本信息,3个shards,2个replicas,可缺省
    wrapper.settings(3,2);

    // 设置别名信息,可缺省
    String aliasName = "daily";
    wrapper.createAlias(aliasName);

    // 创建索引
    return userMapper.createIndex(wrapper);
}

5.2 新增数据

/**
 * 插入一条数据
 * @param user
 * @return
 */
@GetMapping("/add")
public Object add(User user){
    return userMapper.insert(user);
}

在这里插入图片描述
5.3 查询数据列表

/**
 * 获取列表数据
 * @return
 */
@GetMapping("/list")
public Object userList(User user){
    LambdaEsQueryWrapper<User> wrapper = new LambdaEsQueryWrapper<>();
    //排序 年龄降序
    wrapper.orderByAsc(User::getAge);
    //查询 姓名
    wrapper.like(User::getName, user.getName());


    //返回值
    return userMapper.selectList(wrapper);
}

在这里插入图片描述
5.4 编辑一条数据

@GetMapping("/edit")
public Object edit(User user){
    return userMapper.updateById(user);
}

在这里插入图片描述
5.5 杂项

//分词 查询
wrapper.match(ObjectHelper.notEmpty(user.getAddress()), User::getAddress, user.getAddress());
//过滤  只现实某些字段
wrapper.select(User::getName)
//过滤 不显示姓名字段
wrapper.notSelect(User::getName);
//排序 年龄降序
wrapper.orderByAsc(User::getAge);

总结

对于使用过mybatis-plus的开发者来说,可以完全依葫芦画瓢的搬用mybatis-plus的结构、唯一不用的一点就是继承的BaseEsMapper,springboot启动扫描的注解@EsMapperScan("*"),所以使用起来是非常友好,在简单的CURD功能上,感知不到这个是ES搜索引擎,更方便开发者使用和学习。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐