重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍
整合 Elasticsearch 8.x (二)使用Repository
- 1. 环境准备
- 1.1 项目依赖
- 1.2 Elasticsearch 配置
- 2. 使用Repository的基本步骤
- 2.1 创建实体类
- 2.2 创建 Repository 接口
- 2.2.1 主要作用和优点
- 2.2.2 使用场景
- 2.3 服务层实现
- 2.4 控制器层
- 3. 测试应用
- 3.1 启动 Elasticsearch
- 3.2 启动 Spring Boot 应用
- 3.3 测试 API
- 4. 总结
上一篇文章介绍了 Spring Boot 3 整合 Elasticsearch 8.x 的几种客户端形式,除此之外,Spring Data 对 Elasticsearch 还提供了 Repository 支持,与前面讨论的JPA Repository 一样,其基本原理是根据方法名称自动为你构建查询,提供了更简便的数据搜索和分析功能。本文将介绍如何使用 Spring Data Elasticsearch Repository 来构建一个简单的搜索应用。
1. 环境准备
1.1 项目依赖
在 pom.xml 中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
确保 spring-boot-starter-data-elasticsearch 的版本与 Spring Boot 3 兼容。
1.2 Elasticsearch 配置
在 application.properties 或 application.yml 中配置 Elasticsearch 的连接信息:
spring:elasticsearch:uris: "http://localhost:9200"socket-timeout: "10s"username: "user"password: "secret"
2. 使用Repository的基本步骤
2.1 创建实体类
我们定义一个 Product 实体类,表示产品信息:
package com.coderjia.boot318es.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;/*** @author CoderJia* @create 2024/11/3 下午 04:37* @Description**/
@Data
@Document(indexName = "products")
@AllArgsConstructor
public class Product {@Idprivate String id;private String name;private String description;private double price;
}
2.2 创建 Repository 接口
ElasticsearchRepository 是 Spring Data Elasticsearch 提供的一个接口,用于简化与 Elasticsearch 交互的操作。它继承自 CrudRepository 和 PagingAndSortingRepository,扩展了基本的 CRUD(创建、读取、更新、删除)功能,支持分页和排序,还提供了对 Elasticsearch 特有的操作支持。使用 ElasticsearchRepository,开发者可以快速构建功能全面的数据访问层,而无需编写复杂的 Elasticsearch 客户端代码。
2.2.1 主要作用和优点
- 简化数据操作:提供了基础的 CRUD 方法,如
save()、findById()、findAll()和deleteById()等,方便开发者直接使用。 - 自定义查询:通过定义接口中的方法(如
findByName(String name)),可以自动生成符合方法命名规范的查询。 - 分页与排序:内置了分页和排序支持,方法如
findAll(Pageable pageable)可以直接返回分页数据。 - 与 Spring 无缝集成:使用 Spring 的依赖注入和配置机制,无需手动创建或管理客户端连接。
- 减少代码复杂度:自动实现常用的数据库操作,减少重复代码,提高开发效率。
2.2.2 使用场景
- 需要快速实现基于 Elasticsearch 的应用程序,且不希望编写底层客户端调用代码。
- 开发中涉及到简单或中等复杂度的查询,使用方法命名约定生成查询即可满足需求。
- 项目中需要分页、排序功能而不想手动处理分页逻辑。
定义 ProductRepository 接口,继承 ElasticsearchRepository:
package com.coderjia.boot318es.dao;import com.coderjia.boot318es.bean.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;import java.util.List;/*** @author CoderJia* @create 2024/11/4 下午 09:29* @Description**/
public interface ProductRepository extends ElasticsearchRepository<Product, String> {/*** 自定义通过name查询** @param name* @return*/List<Product> findByName(String name);
}
2.3 服务层实现
在服务层中实现增删改查的业务逻辑:
package com.coderjia.boot318es.service;import com.coderjia.boot318es.bean.Product;
import com.coderjia.boot318es.dao.ProductRepository;
import jakarta.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;/*** @author CoderJia* @create 2024/11/4 下午 09:29* @Description**/
@Service
public class ProductService {@Resourceprivate ProductRepository productRepository;// 创建或更新产品public Product saveProduct(Product product) {return productRepository.save(product);}// 根据 ID 查询产品public Optional<Product> findById(String id) {return productRepository.findById(id);}// 根据名称查询产品public List<Product> findByName(String name) {return productRepository.findByName(name);}// 获取所有产品public Page<Product> findAll(Pageable pageable) {return productRepository.findAll(pageable);}// 删除产品public void deleteProduct(String id) {productRepository.deleteById(id);}
}
2.4 控制器层
在控制器层实现 REST API 接口,处理增删改查请求:
package com.coderjia.boot318es.controller;import com.coderjia.boot318es.bean.Product;
import com.coderjia.boot318es.service.ProductService;
import jakarta.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Optional;/*** @author CoderJia* @create 2024/11/4 下午 09:30* @Description**/
@RestController
@RequestMapping("/products")
public class ProductController {@Resourceprivate ProductService productService;// 创建或更新产品@PostMappingpublic Product createOrUpdateProduct(@RequestBody Product product) {return productService.saveProduct(product);}// 根据 ID 查询产品@GetMapping("/{id}")public Optional<Product> getProductById(@PathVariable String id) {return productService.findById(id);}// 根据名称查询产品@GetMapping("/search")public List<Product> searchByName(@RequestParam String name) {return productService.findByName(name);}// 获取所有产品@GetMappingpublic List<Product> getAllProducts(@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "10") int size) {Pageable pageable = PageRequest.of(page, size);Page<Product> products = productService.findAll(pageable);return products.getContent();}// 删除产品@DeleteMapping("/{id}")public String deleteProduct(@PathVariable String id) {productService.deleteProduct(id);return "Product deleted successfully!";}
}
3. 测试应用
3.1 启动 Elasticsearch
确保 Elasticsearch 8.x 正在运行,并且可以通过 http://localhost:9200 访问。
3.2 启动 Spring Boot 应用
运行 Spring Boot 应用,确保没有错误。
3.3 测试 API
创建产品:
POST http://localhost:8080/products
Content-Type: application/json{"id": "1","name": "coderjia","description": "desc v1","price": 1.0
}

更新产品:
POST http://localhost:8080/products
Content-Type: application/json{"id": "1","name": "coderjia","description": "desc v2","price": 2.0
}

根据 ID 查询产品:
GET http://localhost:8080/products/1

根据名称查询产品:
GET http://localhost:8080/products/search?name=coderjia

获取所有产品(分页):
GET http://localhost:8080/products?page=0&size=3

删除产品:
DELETE http://localhost:8080/products/1

4. 总结
通过以上步骤,我们构建了一个完整的 Spring Boot 3 和 Elasticsearch 8.x 的增删改查示例应用。使用 Spring Data Elasticsearch Repository,我们能够快速实现对 Elasticsearch 的基本 CRUD 操作,简化了开发流程。希望这个示例能够帮助你理解如何在项目中有效使用 Elasticsearch!
相关文章:
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤2.1 创建实体类2.2 创…...
为什么说模拟电路的难点就在开通过程和关断过程?难在什么地方?
模拟电路中开通过程和关断过程之所以困难,主要有以下几个方面的原因: 1. 瞬态响应特性复杂 - 在开通和关断瞬间,电路中的电流和电压会发生快速变化,产生复杂的瞬态响应。这些瞬态响应可能包含过冲、下冲、振铃等现象,…...
CubeIDE BUG-project‘hello‘has no explict encoding set hello
projecthellohas no explict encoding set hello 解决方法: 点击红色处注册账号后登录,删除原本文件后重新生成即可。...
在线PDF转图片网站
https://www.ilovepdf.com/download/qgxkmbzgxt6yb3s8l9f7fc3q9606hq0bfh4b33mnrf3p7tp8l0d4qy386b5dxqwjbhq7j3j4tp20m4dnb89wA9jjw25br1gtAw42l0m1sq047nvld4qqrm8kzjplkAhw9458p4wjgbmn08g49l23c1khsggdx4A7z3m9xh19mgzdlllyA6r1/52 在线excel转图片 https://www.zamzar.c…...
ps和top的区别
时间上的区别: ps是静态查看进程而top是动态持续监控进程 功能上的区别 ps只是查看进程,top还可以监视系统性能,如平均负载,cpu和内存的消耗 ps 常用格式:ps -ef (ef简洁aux详细 System V风格和BSD 风格) | grep P…...
自动驾驶上市潮中,会诞生下一个“英伟达”吗?
站上科技创新潮头的企业总是备受资本青睐。20世纪开始,从IT到互联网,IBM、英特尔、微软、苹果等各大科技巨头,你方唱罢我登场。 近几年,人工智能成为资本市场新传奇故事的孕育之地。今年10月,英伟达市值首度突破3.5万…...
CSS 计数器:深入解析与高级应用
CSS 计数器:深入解析与高级应用 CSS 计数器是前端开发中一个强大但经常被忽视的功能。它们允许开发者创建和管理自定义的计数序列,这在处理复杂文档结构时尤其有用。本文将深入探讨 CSS 计数器的原理、用法,并展示一些高级应用示例。 什么是…...
【真题笔记】15年系统架构设计师要点总结
【真题笔记】15年系统架构设计师要点总结 分布式数据库中各种透明RAID 5IPv6 IPv4电子商务系统项目配置管理IPO图(输入加工输出图)桥接模式的UML图面向对象设计原则软件测试 在15年真题练习中,对错题模棱两可的考点进行重点记录与内容延申。…...
斗破C++编程入门系列之三十九:多态性:纯虚函数和抽象类(四星斗师)
斗破C目录: 斗破C编程入门系列之前言(斗之气三段) 斗破C编程入门系列之二:Qt的使用介绍(斗之气三段) 斗破C编程入门系列之三:数据结构(斗之气三段) 斗破C编程入门系列之…...
目前美国的互联网环境
随着科技的迅猛发展,互联网已经成为了现代社会不可或缺的一部分。作为全球科技创新的领导者之一,美国在互联网领域拥有着丰富的资源和先进的技术。本文将对美国目前的互联网环境进行探讨,包括网络基础设施、网络安全、数字经济以及互联网对社…...
从最小作用量原理推导牛顿三大定律
从最小作用量原理推导牛顿三大定律 引言 在物理学中,牛顿三大定律是描述经典力学中物体运动的基本定律。然而,这些定律并不是孤立存在的,它们可以从一个更为普遍的原理——最小作用量原理中推导出来。最小作用量原理是一个深刻而优雅的理论…...
【系统集成项目管理工程师教程】第4章 信息系统架构
教程内容总结,供参考,有错误请指正,友好交流。 4.架构基础 4.1.1指导思想 4.1.2设计原则 原则内容:包括坚持以人为本、创新引领、问题导向、整体协同、安全可控、科学实施等,这些原则应基于组织的信念和价值观&…...
docker下迁移elasticsearch的问题与解决方案
欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 docker下迁移elasticsearch的问题与解决方案 数据挂载报错解决权限问题节点故障 直接上图&#x…...
占地1.1万平,2亿投资的智能仓储系统:高架库、AGV、码垛机器人……
导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 我国调味料市场近年来展现出惊人的增长潜力,各大品牌纷纷加大投入,力求在竞争中脱颖而出。 广东美味鲜调味食品有限公司,作为行业内的佼佼者&#…...
一个小程序如何对接多个收款账户?
背景 我又来了,之前对接过网约巴士系统 网约巴士旅游专线平台搭建历程,运营了两年多了。在运营中完善、在完善中学习,一直是不变的真理。有一句话说得好:先做一个垃圾、用起来再说。 今天又需要升级了,需求是&#…...
L2G4000 InternVL 部署微调实践闯关任务
一、理解多模态大模型的常见设计模式,可以大概讲出多模态大模型的工作原理。 视频地址 开源的多模态大模型:InternVL,Qwen-VL,LLaVA 闭源的:GPT-4o 研究重点:不同模态特征空间的对齐 BLIP2 将图像特征对…...
asynDriver-6-端口驱动
本地串口 drvAsynSerialPort驱动支持设备连接到IOC上串口。 用drvAsynSerialPortConfigure和asynSetOption命令配置串口: drvAsynSerialPortConfigure("portName","ttyName",priority,noAutoConnect,noProcessEosIn) asynSetOption("po…...
[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的基于Python的DjangoVue3在线考试系统,分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…...
Python使用爬虫
一、基本介绍 爬虫(Web Scraping)是一种自动化获取网页内容的技术,它通过编写程序模拟浏览器的行为,从互联网上抓取网页数据。爬虫可以用于多种目的,比如数据收集、信息整合、自动化测试等。 二、常用的库 1、Request…...
CommunityToolkit.Mvvm如何使用
CommunityToolkit.Mvvm 是一个现代、快速和模块化的 MVVM 库,用于 .NET 应用程序。以下是如何使用 CommunityToolkit.Mvvm 的基本步骤: 安装包: 你可以通过 NuGet 包管理器安装 CommunityToolkit.Mvvm。在 Visual Studio 中,你可以…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
