SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

embedded/2025/3/4 18:57:31/
elasticsearch__4">SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式
  • 前言
  • 添加maven依赖
  • 配置application.properties
  • 测试实体类
    • 方式一:继承 ElasticsearchRepository(适合简单查询)
      • 直接使用
      • 想自定义自己的Repository接口
    • 方式二:使用ElasticsearchRestTemplate(更适合用于复杂查询)
      • 添加单个文档
      • 简单查询-通过id

前言

  • 由 Spring 提供,是 Spring 在 ES 官方接口基础之上的二次封装,使用简单,易于上手;
  • 缺点是更新太慢,SpringBoot 2.2.x 才提供对 es7.x 的支持,版本关联性很大,不易维护;

不过在此还是讲一下 starter 启动器下的 集成步骤,万一官方更新速度加快了呢。

Java High Level Rest Client方式 去集成 Elasticsearch(这个是目前公司常用的方式)

添加maven依赖

<!--spring boot 整合 elasticsearch -->
<!--不用填写具体版本,spring boot 会自动找与之适配的 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置application.properties

旧版本

server.port=8091spring.elasticsearch.rest.uris=http://127.0.0.1:9200
spring.elasticsearch.rest.username=elastic
spring.elasticsearch.rest.password=1234567

新版本(去掉了rest)

server.port=8091spring.elasticsearch.uris=http://127.0.0.1:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password=1234567

测试实体类

创建一个员工的实体类
关键注解 @Document、@Id、@Field

package com.example.springbootfull.elasticsearch.bean;import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;import java.math.BigDecimal;
import java.util.Date;/*** 员工实体类* @Document:作用在类上,标记实体类为文档对象。 indexName(索引名称,相当于数据库的表名称)* @Id:作用在成员变量上,标记一个字段作为id主键。 在Elasticsearch中,文档ID是唯一的,用于标识文档。* @Field:定义Java对象属性与Elasticsearch文档字段之间的映射关系。* @author*/
@Document(indexName = "employee_info")
public class EmployeeInfo {@Idprivate Long id;/*** 工号*/@Field(name = "job_no")private String jobNo;/*** 姓名*/@Field(name = "name")private String name;/*** 英文名*/@Field(name = "english_name")private String englishName;/*** 工作岗位*/private String job;/*** 性别*/private Integer sex;/*** 年龄*/private Integer age;/*** 薪资*/private BigDecimal salary;/*** 入职时间*/@Field(name = "job_day", format = DateFormat.date_time)private Date jobDay;/*** 备注*/private String remark;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getJobNo() {return jobNo;}public void setJobNo(String jobNo) {this.jobNo = jobNo;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEnglishName() {return englishName;}public void setEnglishName(String englishName) {this.englishName = englishName;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Integer getSex() {return sex;}public void setSex(Integer sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public BigDecimal getSalary() {return salary;}public void setSalary(BigDecimal salary) {this.salary = salary;}public Date getJobDay() {return jobDay;}public void setJobDay(Date jobDay) {this.jobDay = jobDay;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public EmployeeInfo() {}public EmployeeInfo(Long id, String jobNo, String name, String englishName, String job, Integer sex, Integer age, BigDecimal salary, Date jobDay, String remark) {this.id = id;this.jobNo = jobNo;this.name = name;this.englishName = englishName;this.job = job;this.sex = sex;this.age = age;this.salary = salary;this.jobDay = jobDay;this.remark = remark;}@Overridepublic String toString() {return "EmployeeInfo{" +"id=" + id +", jobNo='" + jobNo + ''' +", name='" + name + ''' +", englishName='" + englishName + ''' +", job='" + job + ''' +", sex=" + sex +", age=" + age +", salary=" + salary +", jobDay=" + jobDay +", remark='" + remark + ''' +'}';}
}

方式一:继承 ElasticsearchRepository(适合简单查询)

ElasticsearchRepository 提供了一个高级的抽象,使得你可以在不编写任何实现代码的情况下,直接使用预定义的CRUD方法和查询方法。

业务层接口继承 ElasticsearchRepository 类
泛型的参数分别是实体类型和主键类型
例如:

public interface EmployeeInfoRepository extends ElasticsearchRepository<EmployeeInfo, Long> {}

然后就可以直接使用了

直接使用

添加单个文档

package com.example.springbootfull.elasticsearch.controller;import com.example.springbootfull.elasticsearch.bean.EmployeeInfo;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoRepository;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {@Autowiredprivate EmployeeInfoRepository elasticRepository;@RequestMapping("/save")public String save() throws Exception {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");EmployeeInfo employeeInfo = new EmployeeInfo(6001L, "2001", "张三", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注");elasticRepository.save(employeeInfo);return "success";}}

执行后,es上面新增成功了。
在这里插入图片描述

想自定义自己的Repository接口

就要遵守 自定义方法命名规范

【自定义方法命名约定】:
在这里插入图片描述

例如:我们来按照年龄区间查询,定义这样的一个方法findByAgeBetween:

/*** 需要继承ElasticsearchRepository接口* 由于Item实体类中id为Long类型*/
public interface EmployeeInfoRepository extends ElasticsearchRepository<EmployeeInfo, Long>/*** 方法名必须遵守SpringData的规范* 年龄区间查询*/List<EmployeeInfo> findByAgeBetween(int age1, int age2);
}

然后,再通过saveAll新增多些数据,再进行自定义的方法进行查询

package com.example.springbootfull.elasticsearch.controller;import com.example.springbootfull.elasticsearch.bean.EmployeeInfo;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoRepository;
import com.example.springbootfull.elasticsearch.service.EmployeeInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {@Autowiredprivate EmployeeInfoRepository elasticRepository;@RequestMapping("/saveAll")public String saveAll() throws Exception {List<EmployeeInfo> list = new ArrayList<>();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");list.add(new EmployeeInfo(1001L, "2001", "张三", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1002L, "2002", "李四", "lisi", "PHP", 1, 18, new BigDecimal("11600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1003L, "2003", "王五", "wangwu", "C++", 1, 20, new BigDecimal("9900.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1004L, "2004", "赵六", "zhaoliu", "Java Leader", 1, 20, new BigDecimal("20000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1005L, "2005", "小五", "xiaowu", "H5", 1, 17, new BigDecimal("10600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1006L, "2006", "小六", "xaioliu", "web", 1, 20, new BigDecimal("12600.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1007L, "2007", "小七", "xiaoqi", "app", 1, 22, new BigDecimal("20000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1008L, "2008", "小八", "xaioba", "Java", 1, 21, new BigDecimal("11000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1009L, "2009", "小九", "xiaojiu", "Java", 1, 20, new BigDecimal("14000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));list.add(new EmployeeInfo(1010L, "2010", "大十", "dashi", "Java", 1, 20, new BigDecimal("13000.01"), simpleDateFormat.parse("2019-09-10"), "备注"));elasticRepository.saveAll(list);return "success -> " + list.size();}@RequestMapping("/findByAgeBetween")public String findByAgeBetween(){elasticRepository.findByAgeBetween(10,20);return "success";}}

使用 findByAgeBetween 查询后的效果
在这里插入图片描述

方式二:使用ElasticsearchRestTemplate(更适合用于复杂查询)

与 ElasticsearchRepository 相比,ElasticsearchRestTemplate 更适合用于复杂查询 。
比如 多个条件组合、范围查询、模糊查询、聚合查询等复杂场景
还支持分页、排序、过滤等高级功能

添加单个文档
@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@RequestMapping("/template/save")public String  templateSave() throws Exception  {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");EmployeeInfo employeeInfo = new EmployeeInfo(8888L, "2001", "张八", "zhangsan", "Java", 1, 19, new BigDecimal("12500.01"), simpleDateFormat.parse("2019-09-10"), "备注");elasticsearchRestTemplate.save(employeeInfo);return "success";}

在这里插入图片描述

简单查询-通过id
@RestController
@RequestMapping("/employeeInfo")
public class EmployeeElasticController {@Autowiredprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@RequestMapping("/getEmployeeInfo")public EmployeeInfo getEmployeeInfo() {return elasticsearchRestTemplate.get("6001", EmployeeInfo.class);}

查询结果如下
在这里插入图片描述

批量添加、删除、复杂的查询 等等 其余的我就不多说了

【参考文章】
【1】SpringBoot-starter-data整合Elasticsearch
【2】SpringBoot之ElasticsearchRestTemplate常用示例
【3】Spring Data Elasticsearch篇(3):ElasticsearchRepository文档操作


http://www.ppmy.cn/embedded/169990.html

相关文章

React Native从入门到进阶详解

React Native知识框架从入门到进阶的问题。首先需要结合我搜索到的资料来整理出结构化的内容。证据中有多本书籍和文章&#xff0c;可能会涉及不同的章节和重点&#xff0c;需要仔细梳理。 首先&#xff0c;根据邱鹏源的《React Native精解与实战》将知识分为入门和进阶两大部分…

Rust语言基础知识详解【五】

继上一篇对rust所有权的讲解之后&#xff0c;本节主要对接下来的引用与借用的知识做详细的介绍。 上节中提到&#xff0c;如果仅仅支持通过转移所有权的方式获取一个值&#xff0c;那会让程序变得复杂。 Rust 能否像其它编程语言一样&#xff0c;使用某个变量的指针或者引用呢…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

Spring MVC 返回数据

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么&#xff1f;有什么关系&#xff1f; Servlet 是 java 官方定义的 web 开发的标准规范&#xff1b;Tomcat 是…

jenkins集成docker发布java项目

1、创建pipeline流水线任务 2、进入配置选项 选择参数化构建 3、添加2个字符参数&#xff0c;用于传递变量 4、编写pipeline脚本 //所有脚本命令都放在pipeline中 pipeline{//指定任务再哪个集群节点中执行agent any//声明全局变量&#xff0c;方便后面使用environment {harbor…

爬虫:一文掌握WebSocket爬虫案例实战

文章目录 1. WebSocket 简介1.1 什么是 WebSocket?1.2 WebSocket 的特点2. WebSocket 爬虫的基本原理3. 使用 Python 实现 WebSocket 爬虫3.1 安装依赖3.2 使用 websocket-client 实现爬虫3.3 使用 websockets 实现爬虫3.4 重连机制3.5 解析和处理消息4. 实战案例:爬取实时股…

LeetCode 面试题 17.19. 消失的两个数字

LeetCode 面试题 17.19. 消失的两个数字 思路&#x1f9d0;&#xff1a; 运用位运算&#xff0c;我们先创建一个变量tmp&#xff0c;依次异或nums和1~N所有整数&#xff0c;此时就可以得到两个数的异或值。 然后通过右移操作&#xff0c;逐位检查tmp中的每一位&#xff0c;找到…

DeepSeek 开源狂欢周(五)正式收官|3FS并行文件系统榨干SSD

千呼万唤始出来&#xff01;在 DeepSeek 开源周 的第五天&#xff0c;今日正式收官&#xff01;在大模型训练中&#xff0c;每个epoch都在与存储系统进行光速竞赛——数据加载延迟会扭曲计算时空&#xff0c;KVCache访问瓶颈将引发推理坍缩。DeepSeek开源的 3FS文件系统&#x…