重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》

期待您的点赞??收藏评论

整合 Elasticsearch 8.x (二)使用Repository
  • [1. 环境准备](#1. 环境准备)
    • [1.1 项目依赖](#1.1 项目依赖)
    • [1.2 Elasticsearch 配置](#1.2 Elasticsearch 配置)
  • [2. 使用Repository的基本步骤](#2. 使用Repository的基本步骤)
    • [2.1 创建实体类](#2.1 创建实体类)
    • [2.2 创建 Repository 接口](#2.2 创建 Repository 接口)
      • [2.2.1 主要作用和优点](#2.2.1 主要作用和优点)
      • [2.2.2 使用场景](#2.2.2 使用场景)
    • [2.3 服务层实现](#2.3 服务层实现)
    • [2.4 控制器层](#2.4 控制器层)
  • [3. 测试应用](#3. 测试应用)
    • [3.1 启动 Elasticsearch](#3.1 启动 Elasticsearch)
    • [3.2 启动 Spring Boot 应用](#3.2 启动 Spring Boot 应用)
    • [3.3 测试 API](#3.3 测试 API)
  • [4. 总结](#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.propertiesapplication.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 {
    @Id
    private String id;
    private String name;
    private String description;
    private double price;
}

2.2 创建 Repository 接口

ElasticsearchRepository 是 Spring Data Elasticsearch 提供的一个接口,用于简化与 Elasticsearch 交互的操作。它继承自 CrudRepositoryPagingAndSortingRepository,扩展了基本的 CRUD(创建、读取、更新、删除)功能,支持分页和排序,还提供了对 Elasticsearch 特有的操作支持。使用 ElasticsearchRepository,开发者可以快速构建功能全面的数据访问层,而无需编写复杂的 Elasticsearch 客户端代码。

2.2.1 主要作用和优点
  1. 简化数据操作 :提供了基础的 CRUD 方法,如 save()findById()findAll()deleteById() 等,方便开发者直接使用。
  2. 自定义查询 :通过定义接口中的方法(如 findByName(String name)),可以自动生成符合方法命名规范的查询。
  3. 分页与排序 :内置了分页和排序支持,方法如 findAll(Pageable pageable) 可以直接返回分页数据。
  4. 与 Spring 无缝集成:使用 Spring 的依赖注入和配置机制,无需手动创建或管理客户端连接。
  5. 减少代码复杂度:自动实现常用的数据库操作,减少重复代码,提高开发效率。
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 {

    @Resource
    private 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 {

    @Resource
    private ProductService productService;

    // 创建或更新产品
    @PostMapping
    public 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);
    }

    // 获取所有产品
    @GetMapping
    public 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!

相关推荐
深海鱼肝油ya42 分钟前
向量数据库Elasticsearch(四)搜索文档——各种方式
人工智能·elasticsearch·向量数据库·es搜索文档·只能体·非结构化数据库
科创致远1 小时前
科创致远 ESD 静电监控系统全场景落地指南
大数据·人工智能·制造·精益工程
蓝速科技1 小时前
商用复杂环境翻译机耐用性选型指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
yt004yt2 小时前
工业园区绿岛 VOCs 废气治理管网设计与能碳节能设计经验分享
大数据·运维
航飞光电市场经理2 小时前
UWB定位技术选型指南:从芯片架构到定位引擎的底层能力分析
大数据·人工智能·物联网·安全·人员定位
Raas1002 小时前
MAI Gateway(魔芋企业级AI网关)功能全解:AI网关支持本地模型吗?一文看懂AI网关能力矩阵
大数据·人工智能·网关·ai网关·mai gateway·企业级产品
爱签AI电子合同3 小时前
电子合同服务稳定性怎么测?可用性保障维度专项测评
大数据·人工智能·电子合同·电子签名
跨境数据猎手3 小时前
从零搭建多平台二手ERP中台:闲鱼、淘宝、京东、拼多多、Mercari统一调度架构
大数据·系统架构·团队开发
Francek Chen3 小时前
【大数据处理与分析】数据仓库Hive:04 数据仓库Hive概述
大数据·数据仓库·hive·hadoop·分布式
Leo.yuan4 小时前
2026国产数据仓库软件有哪些?从数据库、云数仓到数据集成平台一次讲清
大数据