重学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 中,你可以…...
为Qwen-VL“点亮”视觉思维:从注意力热力图洞察多模态对齐的深层逻辑
1. 理解Qwen-VL的视觉思维机制 当你第一次看到Qwen-VL这类视觉语言模型时,可能会好奇它究竟是如何"看"图片的。想象一下,你正在教一个小朋友看图说话:小朋友会先扫视整张图片,然后目光停留在某些关键区域,最…...
别再手动输路径了!用VS Code Remote-WSL一键直达Ubuntu 20.04的home目录
极速直达WSL开发环境:VS Code高效工作流全指南 每次在Windows和WSL之间来回切换路径,就像在两个平行宇宙间手动搭建桥梁。作为深度使用WSL的开发者,我经历过无数次在资源管理器地址栏手输\\wsl$的痛苦,也曾在终端反复cd到项目目录…...
DeepSeekGEO生成式引擎优化技术方案
DeepSeekGEO生成式引擎优化技术方案技术支持:拓世网络技术开发工作室1 方案背景与技术范式转移随着生成式AI成为信息分发的主入口,用户获取信息的方式已从“搜索-点击”转变为“提问-答案”。据统计,超过60%的Z世代用户更倾向于通过AI助手获取…...
告别传统方法:LogAnomaly如何用NLP技术提升日志异常检测准确率?
告别传统方法:LogAnomaly如何用NLP技术重构日志异常检测范式? 日志数据如同数字世界的神经系统,记录着系统运行的每一次"心跳"与"呼吸"。传统检测方法就像拿着放大镜寻找心电图异常,而LogAnomaly则带来了全新…...
Python胶水代码变高性能引擎(Mojo原生编译实战手记)
第一章:Python胶水代码变高性能引擎(Mojo原生编译实战手记)Python 以其简洁语法和丰富生态成为数据科学与系统集成的“胶水语言”,但其解释执行机制常在数值计算、实时推理等场景遭遇性能瓶颈。Mojo 作为新兴的系统级编程语言&…...
KT0803K FM发射芯片Arduino驱动开发与射频工程实践
1. KT0803系列FM发射芯片Arduino库深度解析与工程实践指南1.1 芯片定位与系统级约束KT0803及其衍生型号(KT0803K/L/M)是高度集成的单芯片FM广播发射器,专为低功耗、小体积音频广播应用设计。该系列芯片内部集成了PLL频率合成器、立体声编码器…...
大数据:Hadoop(Yarn)
第1章 Yarn资源调度器Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。1.1 Yarn基础架构1.2 Yarn工作机制(1)…...
新手入门:在快马平台动手实现你的第一个ui-ux-pro-max设计页面
作为一个刚接触前端设计的新手,最近在InsCode(快马)平台尝试做了一个UI-UX-Pro-Max级别的登录注册页面,整个过程意外地顺利。这里记录下我的实践过程,希望能帮到同样想入门的朋友。 从零搭建页面框架 先用HTML搭建基础结构,包含表…...
102. 在控制平面主机名更改后恢复 Rancher 配置的 RKE2 集群
Environment 环境 Rancher provisioned RKE2 downstream cluster control plane node hostname changed, without removing the node from the cluster. Rancher 配置了 RKE2 下游集群控制平面节点的主机名更改,但未将该节点从集群中移除。 Procedure 程序It is …...
微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程
微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.co…...
