Springboot整合Easy-Es

news2025/1/11 7:44:40

版本说明

  • Springboot 2.7.5
  • JDK 17
  • Elasticsearch 7.14.0
  • Easy-Es 1.1.1
  • 《点我进入Easy-Es官网》PS:目前Easy-Es暂不支持SpringBoot3.X

Windows10安装Elasticsearch

《安装Elasticsearch教程》

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.aoxqwl</groupId>
    <artifactId>eedemo</artifactId>
    <version>1</version>
    <name>eedemo</name>
    <description>eedemo</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- lombok插件依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- Easy-Es暂不支持SpringBoot3.X,且推荐Elasticsearch版本为7.14.0 -->
        <dependency>
            <groupId>cn.easy-es</groupId>
            <artifactId>easy-es-boot-starter</artifactId>
            <version>1.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                </exclusion>
                <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>
    </dependencies>

application.yml

easy-es:
  enable: true #默认为true,若为false则认为不启用本框架
  banner: false # 默认为true 打印banner 若您不期望打印banner,可配置为false
  address : 127.0.0.1:9200 # es的连接地址,必须含端口 若为集群,则可以用逗号隔开 例如:127.0.0.1:9200,127.0.0.2:9200
  username: elastic #若无 则可省略此行配置
  password: WG7WVmuNMtM4GwNYkyWH #若无 则可省略此行配置
  # 请求通信超时时间 单位:ms 在平滑模式下,由于要迁移数据,用户可根据数据量大小调整此参数值大小,否则请求容易超时导致索引托管失败,建议您尽量给大不给小
  socketTimeout: 5000
  global-config:
    # 项目是否分布式环境部署,默认为true, 如果是单机运行可填false,将不加分布式锁,效率更高.
    distributed: false

Document实体类

import cn.easyes.annotation.HighLight;
import cn.easyes.annotation.IndexField;
import cn.easyes.annotation.IndexId;
import cn.easyes.annotation.IndexName;
import cn.easyes.annotation.rely.FieldType;
import cn.easyes.annotation.rely.IdType;
import lombok.Data;

@Data
@IndexName(value = "document")
public class Document {
    /**
     * es中的唯一id,如果你想自定义es中的id为你提供的id,比如MySQL中的id,请将注解中的type指定为customize,如此id便支持任意数据类型)
     */
    @IndexId(type = IdType.NONE)
    private String id;

    /**
     * 文档标题,不指定类型默认被创建为keyword类型,可进行精确查询
     */
    @IndexField(value = "title")
    private String title;

    /**
     * 文档内容,指定了类型及存储/查询分词器
     */
    @HighLight(mappingField = "highlightContent") //对应下面的highlightContent变量名
    @IndexField(value = "content", fieldType = FieldType.TEXT)
    private String content;

    /**
     * 创建时间
     */
    @IndexField(value = "create_time", fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private String createTime;

    /**
     * 不存在的字段
     */
    @IndexField(exist = false)
    private String notExistsField;

    /**
     * 地理位置经纬度坐标 例如: "40.13933715136454,116.63441990026217"
     */
    @IndexField(fieldType = FieldType.GEO_POINT)
    private String location;

    /**
     * 图形(例如圆心,矩形)
     */
    @IndexField(fieldType = FieldType.GEO_SHAPE)
    private String geoLocation;

    /**
     * 自定义字段名称
     */
    @IndexField(value = "wu-la")
    private String customField;

    /**
     * 高亮返回值被映射的字段
     */
    private String highlightContent;

}

DocumentMapper (官方建议:Easy-Es的Mapper和MyBatis-Plus分开存放)

在这里插入图片描述
和MyBatis-Plus差不多都是继承mapper,但是Easy-Es不需要继承Service和ServiceImpl

import cn.easyes.core.conditions.interfaces.BaseEsMapper;
import org.springframework.stereotype.Repository;

@Repository
public interface DocumentMapper extends BaseEsMapper<Document> {

}

DocumentService

人家没有帮我们写,那我们就自己写

public interface DocumentService {

    Integer insert(Document document);

    Document selectById(String id);

    Integer updateById(Document document);

    Integer deleteById(String id);

    List<Document> selectList();

    EsPageInfo<Document> pageQuery(Integer pageIndex, Integer pageSize);

    Integer deleteBatchIds(List<String> ids);
}

DocumentServiceImpl

@Service
public class DocumentServiceImpl implements DocumentService {
    @Resource
    private DocumentMapper documentMapper;

    @Override
    public Integer insert(Document document) {
        return this.documentMapper.insert(document);
    }

    @Override
    public Document selectById(String id) {
        return this.documentMapper.selectById(id);
    }

    @Override
    public Integer updateById(Document document) {
        return this.documentMapper.updateById(document);
    }

    @Override
    public Integer deleteById(String id) {
        return this.documentMapper.deleteById(id);
    }

    @Override
    public List<Document> selectList() {
        LambdaEsQueryWrapper<Document> leqw = new LambdaEsQueryWrapper<>();
        return this.documentMapper.selectList(leqw);
    }

    @Override
    public EsPageInfo<Document> pageQuery(Integer pageIndex, Integer pageSize) {
        LambdaEsQueryWrapper<Document> leqw = new LambdaEsQueryWrapper<>();
        return this.documentMapper.pageQuery(leqw, pageIndex, pageSize);
    }

    @Override
    public Integer deleteBatchIds(List<String> ids) {
        return this.documentMapper.deleteBatchIds(ids);
    }

}

DocumentController

@RestController
@RequestMapping("document")
public class DocumentController {

    @Resource
    private DocumentService documentService;

    /**
     * 测试程序是否正常运行
     */
    @GetMapping("hello")
    public String hello() {
        return "hello world!";
    }

    /**
     * 新增
     */
    @PostMapping
    public Integer insert(@RequestBody Document document) {
        return this.documentService.insert(document);
    }

    /**
     * 查询
     */
    @GetMapping("{id}")
    public Document selectById(@PathVariable String id) {
        return this.documentService.selectById(id);
    }

    /**
     * 更新
     */
    @PutMapping
    public Integer updateById(@RequestBody Document document) {
        return this.documentService.updateById(document);
    }

    /**
     * 删除
     */
    @DeleteMapping("{id}")
    public Integer deleteById(@PathVariable String id) {
        return this.documentService.deleteById(id);
    }

    /**
     * 查询列表
     */
    @GetMapping
    public List<Document> selectList() {
        return this.documentService.selectList();
    }

    /**
     * 分页查询
     */
    @GetMapping("paging")
    public EsPageInfo<Document> pageQuery(@RequestParam(value = "pageIndex", defaultValue = "1") Integer pageIndex,
                                          @RequestParam(value = "pageSize", defaultValue = "1") Integer pageSize) {
        return this.documentService.pageQuery(pageIndex, pageSize);
    }

    /**
     * 批量删除
     */
    @DeleteMapping
    public Integer deleteBatchIds(@RequestBody List<String> ids) {
        return this.documentService.deleteBatchIds(ids);
    }

}

Application启动类加上扫描EsMapper接口注解

@SpringBootApplication
@EsMapperScan("com.aoxqwl.eedemo.mapper.ee") //还是那句话,建议和MyBatis-Plus的mapper分开存放
public class EedemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EedemoApplication.class, args);
    }
}

结束语

整体下来和MyBatis-Plus是非常贴合的,如果你的项目中使用到了MyBatis-Plus,那么首选是Easy-Es!同样的Easy-Es目前占卜支持SpringBoot3.X,也是个美中不足吧。但是我想目前大家的生产环境都没上SpringBoot3.X吧!接口那些就自己用Postman测一下吧,都是没有问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot集成Swagger3.0(入门)01

创建SpringBoot项目 创建完成后再pom文件中导入swagger3.0依赖&#xff0c;具体的pom文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://w…

一看就懂 —— Spring boot + Spring MVC + MyBatis 基础框架demo

目录 前言 一、项目依赖 二、配置文件 三、创建数据库和实体类 3.1、创建数据库 3.2、创建实体类 四、构建 Mapper 层代码实现&#xff08;接口 XML&#xff09; 4.1、创建接口 4.2、创建 XML 4.3、XML 文件与接口的对应关系 五、实现服务层 六、实现控制器 小结 …

原生JS实现拖拽排序

拖拽&#xff08;这两个字看了几遍已经不认识了&#xff09; 说到拖拽&#xff0c;应用场景不可谓不多。无论是打开电脑还是手机&#xff0c;第一眼望去的界面都是可拖拽的&#xff0c;靠拖拽实现APP或者应用的重新布局&#xff0c;或者拖拽文件进行操作文件。 先看效果图&am…

动态IP与静态ip的区别是什么

1、DHCP IP即动态ip&#xff0c;可以自动获取IP地址。静态ip上网又被称为固定IP地址上网&#xff0c;需要手动设置IP地址。2、在网速上&#xff0c;动态ip和静态ip没有区别。3、动态ip不是一个真实的IP地址&#xff0c;静态IP是可以直接上网的IP地址。静态ip和动态ip设置方法&a…

datahub部署

硬件要求DataHub官方要求的最低配置为&#xff1a;2 个 CPU、8GB RAM、2GB 交换区和 10GB 磁盘空间。本文的示例环境为阿里云centos8云服务器安装dockeryum -y install docker sudo systemctl start docker安装docker-composecurl -SL https://get.daocloud.io/docker/compose…

Python3-列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…

VUE前端常问面试题

文章目录一、VUE前端常问面试题二、文档下载地址一、VUE前端常问面试题 1、MVC和MVVM 区别 MVC&#xff1a;MVC全名是 Model View Controller&#xff0c;即模型-视图-控制器的缩写&#xff0c;一种软件设计典范。 Model(模型)&#xff1a;是用于处理应用程序数据逻辑部分。通…

力扣-第二高的薪水

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道中等的力扣sql练习题。 文章目录前言一、题目&#xff1a;176. 第二高的薪水二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结…

[chapter 11][NR Physical Layer][Layer Mapping]

前言&#xff1a;这里参考Curious Being系列 &#xff0c;简单介绍一下NR 5G 物理层核心技术层映射.我们主要讲了一下what is layer Mapping, why need layer Mapping, how layer Mapping 参考文档&#xff1a;3GPP 38.211- 6.3.1.3 Layer mapping《5G NR Physical Layer | Cha…

仓储调度|库存管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着电子商务技术和网络技术的快速发展&#xff0c;现代物流技术也在不断进步。物流技术是指与物流要素活动有关的所有专业技术的总称&#xff0c;包括各种操作方法、管理技能等&#xff0c;物流业采用某些现代信息技术方面的成功经…

智能客服vs人工客服,两者真水火不容?

随着互联网、智能技术的不断发展&#xff0c;Chatgpt的到来引发各界热议&#xff0c;不少人认为Chatgpt将给各个领域带来翻天覆地的变化。而在客服行业&#xff0c;AI产物——智能客服早已落地并且被广泛运用&#xff0c;在Chatgpt爆火的这段时间&#xff0c;有望率先融合应用C…

虚拟局域网VLAN的实现机制

虚拟局域网VLAN的实现机制1.IEEE 802.1Q帧2.交换的端口类型AccessTrunkHybrid&#xff08;华为特有&#xff09;1.IEEE 802.1Q帧 IEEE802.1Q帧&#xff08;也称Dot One Q帧&#xff09;对以太网的MAC帧格式进行了扩展&#xff0c;插入了4字节的VLAN标记。 2.交换的端口类型 A…

实验进行时

torch与cuda版本配对&#xff1a;Previous PyTorch Versions | PyTorch 删除虚拟环境&#xff1a;conda remove -n mygcn --all 时序KG 删掉1.7.1torch装1.8.0&#xff0c;解决报错RuntimeError: CUDA error: no kernel image is available for execution on the 已经成功运…

数组模拟常见数据结构

我们来学习一下用数组模拟常见的数据结构&#xff1a;单链表&#xff0c;双链表&#xff0c;栈&#xff0c;队列。用数组模拟这些常见的数据结构&#xff0c;需要我们对这些数据结构有一定的了解哈。单链表请参考&#xff1a;http://t.csdn.cn/SUv8F 用数组模拟实现比STL要快&a…

PCB板漏孔、漏槽怎么办?看工程师避坑“SOP”

本文为大家介绍PCB画板时常见的钻孔问题&#xff0c;避免后续踩同样的坑。钻孔分为三类&#xff0c;通孔、盲孔、埋孔。不管是哪种孔&#xff0c;孔缺失的问题带来的后果是直接导致整批产品不能使用。因此钻孔设计的正确性尤为重要。 案例讲解 问题1&#xff1a;Altium设计的文…

Linux 进程:进程状态

目录一、进程状态1.简单分类2.详细分类&#xff08;1&#xff09;运行态&#xff08;2&#xff09;休眠态[1]可中断休眠态[2]不可中断休眠态&#xff08;3&#xff09;停止状态&#xff08;4&#xff09;死亡状态&#xff08;5&#xff09;僵死状态二、特殊进程1.僵尸进程2.孤儿…

Java-枚举类的使用(详解)

枚举类的使用前言一、何为枚举类&#xff1f;二、自定义枚举类&#xff08;JDK1.5之前&#xff09;1、实现1.1 属性1.2 构造器2、代码演示三、用关键字enum定义枚举类&#xff08;JDK 1.5&#xff09;1、实现1.1 属性1.2 构造器2、代码演示四、Enum类的方法五、实现接口的枚举类…

GeoServer 存在 sql 注入漏洞

漏洞描述 GeoServer 是一个允许用户共享和编辑地理空间数据的开源软件服务器&#xff0c;支持 OGC Filter expression 和 OGC Common Query Language 语言&#xff0c;使用 PostGIS Datastore 作为数据库。PostGIS是PostgreSQL数据库的扩展程序&#xff0c;增加了数据库对地理…

HTMLCollection 和 NodeList 区别

Node 和 Element DOM 是一棵树&#xff0c;所有节点都是 NodeNode 是 Element 的基类Element 是其他 HTML 元素的基类&#xff0c;如 HTMLDivElement HTMLCollection 和 NodeList HTMLCollection 是 Element 的集合NodeList 是 Node 的集合 <body><p id"p1&qu…

什么是IP地址?

IP协议中还有一个非常重要的内容&#xff0c;那就是给因特网上的每台计算机和其它设备都规定了一种地址&#xff0c;叫做“IP 地址”。由于有这种地址&#xff0c;才保证了用户在连网的计算机上操作时&#xff0c;能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。…