当前位置: 首页 > article >正文

使用cursor开发java案例——springboot整合elasticsearch

安装elasticsearch

在这里插入图片描述

打开cursor,输入如下提示词

使用springboot整合elasticsearch。其中elasticsearch服务器ip:192.168.236.134  
管理员用户名elastic  管理员密码 PdQy_xfR2yLhpok*MK_+  监听端口9200

在这里插入图片描述

点Accept all

在这里插入图片描述
在这里插入图片描述

使用idea打开生成的项目

(不建议使用cursor自带的调试插件,不好用,并且还要开发php、python、vue等等等等)
在这里插入图片描述

install报错,喂给cursor

在这里插入图片描述
在这里插入图片描述

构建成功

在这里插入图片描述
在这里插入图片描述

测试

在这里插入图片描述

cursor给出步骤如下:


使用 Postman 测试 SpringBoot Elasticsearch 应用

下面是使用 Postman 测试您的 SpringBoot Elasticsearch 应用的详细步骤和测试用例:

测试步骤

1. 创建索引

首先需要创建产品索引:

  • 请求方式:POST
  • URLhttp://localhost:8080/api/products/index
  • 请求体:无需请求体
  • 预期结果:返回 “索引创建成功” 或 “索引创建失败,可能已存在”

2. 添加产品

添加一个或多个产品到 Elasticsearch:

  • 请求方式:POST
  • URLhttp://localhost:8080/api/products
  • 请求头Content-Type: application/json
  • 请求体
{
  "id": "1",
  "name": "iPhone 13",
  "description": "苹果最新款手机,性能强劲",
  "price": 6999.0,
  "category": "手机"
}
  • 预期结果:返回 “产品添加成功,ID: 1”

3. 获取产品

根据 ID 获取产品信息:

  • 请求方式:GET
  • URLhttp://localhost:8080/api/products/1
  • 请求体:无需请求体
  • 预期结果:返回产品的 JSON 数据

4. 更新产品

更新已存在的产品信息:

  • 请求方式:PUT
  • URLhttp://localhost:8080/api/products
  • 请求头Content-Type: application/json
  • 请求体
{
  "id": "1",
  "name": "iPhone 13 Pro",
  "description": "苹果最新款专业版手机,性能更强劲",
  "price": 8999.0,
  "category": "手机"
}
  • 预期结果:返回 “产品更新成功,ID: 1”

5. 搜索产品

根据关键词搜索产品:

  • 请求方式:GET
  • URLhttp://localhost:8080/api/products/search?keyword=苹果
  • 请求体:无需请求体
  • 预期结果:返回包含关键词的产品列表

6. 删除产品

删除指定 ID 的产品:

  • 请求方式:DELETE
  • URLhttp://localhost:8080/api/products/1
  • 请求体:无需请求体
  • 预期结果:返回 “产品删除成功,ID: 1”

完整测试流程

  1. 启动您的 SpringBoot 应用
  2. 按照上述步骤依次执行测试
  3. 验证每个请求的响应是否符合预期

更多测试用例

添加多个产品

// 产品2
{
  "id": "2",
  "name": "华为 Mate 50",
  "description": "华为旗舰手机,拍照性能出色",
  "price": 5999.0,
  "category": "手机"
}

// 产品3
{
  "id": "3",
  "name": "MacBook Pro",
  "description": "苹果专业笔记本电脑,适合开发人员",
  "price": 12999.0,
  "category": "笔记本电脑"
}

// 产品4
{
  "id": "4",
  "name": "iPad Pro",
  "description": "苹果平板电脑,支持Apple Pencil",
  "price": 6499.0,
  "category": "平板电脑"
}

搜索不同关键词

  • 搜索 “华为”:http://localhost:8080/api/products/search?keyword=华为
  • 搜索 “电脑”:http://localhost:8080/api/products/search?keyword=电脑
  • 搜索 “专业”:http://localhost:8080/api/products/search?keyword=专业

故障排除

如果您在测试过程中遇到问题,请检查:

  1. 应用是否正常启动,没有报错
  2. Elasticsearch 服务是否可访问(可以通过 curl -u elastic:PdQy_xfR2yLhpok*MK_+ http://192.168.236.134:9200 测试)
  3. 请求参数和格式是否正确
  4. 查看应用日志,了解可能的错误原因

希望这些测试步骤和用例对您有所帮助!如果有任何问题,请随时提问。


我们根据给出的测试步骤来试下

在这里插入图片描述

出现链接超时

在这里插入图片描述

关闭防火墙还是有问题

继续问题cursor

在这里插入图片描述

经过几轮对话,解决版本问题、密钥问题,接口调用成功

在这里插入图片描述

测试添加产品接口

在这里插入图片描述

调用获取产品接口

在这里插入图片描述

调用更新产品

在这里插入图片描述

测试成功!

对elasticsearch 还不太熟悉的小伙伴,想要快速上手elasticsearch怎么办呢?
直接让cursor给出学习手册
在这里插入图片描述

Elasticsearch 快速上手指导手册

1. 概述

你的项目是一个使用 Spring Boot 集成 Elasticsearch 的应用程序,用于产品数据的索引和搜索。从代码中可以看出,你已经有了一个完整的基础架构,包括配置、服务层和控制器。

2. Elasticsearch 基础知识

Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎,基于 Apache Lucene 构建。它能够快速存储、搜索和分析大量数据。

核心概念

  • 索引(Index): 类似于关系型数据库中的"数据库"
  • 类型(Type): ES 7.x 后已弃用,在 8.x 中完全移除
  • 文档(Document): 类似于关系型数据库中的"行"
  • 字段(Field): 类似于关系型数据库中的"列"
  • 映射(Mapping): 定义文档及其字段如何存储和索引

3. 你的项目结构

你的项目已经配置好了以下组件:

  1. ElasticsearchConfig: 配置 Elasticsearch 客户端连接
  2. ElasticsearchService: 提供索引和文档操作的服务
  3. ProductController: REST API 控制器
  4. Product: 产品模型类

4. 使用指南

4.1 启动应用

确保 Elasticsearch 服务器已启动,然后运行你的 Spring Boot 应用:

mvn spring-boot:run

4.2 创建索引

首先需要创建索引,通过以下 API 调用:

POST http://localhost:8080/api/products/index

这将创建一个名为 “products” 的索引,包含 id、name、description、price 和 category 字段。

4.3 添加产品

POST http://localhost:8080/api/products
Content-Type: application/json

{
  "id": "1",
  "name": "iPhone 13",
  "description": "Apple iPhone 13 with A15 Bionic chip",
  "price": 799.99,
  "category": "electronics"
}

4.4 获取产品

GET http://localhost:8080/api/products/1

4.5 更新产品

PUT http://localhost:8080/api/products
Content-Type: application/json

{
  "id": "1",
  "name": "iPhone 13",
  "description": "Apple iPhone 13 with A15 Bionic chip and improved camera",
  "price": 749.99,
  "category": "electronics"
}

4.6 搜索产品

GET http://localhost:8080/api/products/search?keyword=iPhone

4.7 删除产品

DELETE http://localhost:8080/api/products/1

5. 代码解析

5.1 ElasticsearchConfig

这个类配置了 Elasticsearch 客户端连接,包括:

  • 主机、端口、用户名和密码
  • SSL 配置(信任所有证书)
  • 连接和超时设置

5.2 ElasticsearchService

提供了以下功能:

  • 创建索引和检查索引是否存在
  • 添加、获取、更新和删除文档
  • 搜索文档

5.3 ProductController

提供 RESTful API 端点,调用 ElasticsearchService 的方法。

6. 常见操作示例

6.1 复杂搜索

你可以扩展 searchProducts 方法来支持更复杂的搜索:

public List<Product> searchProductsAdvanced(String keyword, String category, Double minPrice, Double maxPrice) throws IOException {
    SearchResponse<Product> response = client.search(s -> {
        s.index(INDEX);
        
        // 构建布尔查询
        BoolQuery.Builder boolQuery = new BoolQuery.Builder();
        
        // 关键字搜索
        if (keyword != null && !keyword.isEmpty()) {
            boolQuery.must(q -> q
                .multiMatch(m -> m
                    .query(keyword)
                    .fields("name", "description")
                )
            );
        }
        
        // 分类过滤
        if (category != null && !category.isEmpty()) {
            boolQuery.filter(f -> f
                .term(t -> t
                    .field("category")
                    .value(category)
                )
            );
        }
        
        // 价格范围过滤
        if (minPrice != null || maxPrice != null) {
            RangeQuery.Builder rangeQuery = new RangeQuery.Builder().field("price");
            if (minPrice != null) {
                rangeQuery.gte(JsonData.of(minPrice));
            }
            if (maxPrice != null) {
                rangeQuery.lte(JsonData.of(maxPrice));
            }
            boolQuery.filter(f -> f.range(rangeQuery.build()));
        }
        
        return s.query(q -> q.bool(boolQuery.build()));
    }, Product.class);
    
    List<Product> products = new ArrayList<>();
    for (Hit<Product> hit : response.hits().hits()) {
        products.add(hit.source());
    }
    
    return products;
}

6.2 聚合查询

添加一个方法来获取每个分类的产品数量:

public Map<String, Long> getProductCountByCategory() throws IOException {
    SearchResponse<Void> response = client.search(s -> s
        .index(INDEX)
        .size(0)  // 不需要返回文档,只需要聚合结果
        .aggregations("categories", a -> a
            .terms(t -> t
                .field("category")
                .size(100)  // 返回最多100个分类
            )
        ),
        Void.class
    );
    
    Map<String, Long> result = new HashMap<>();
    List<StringTermsBucket> buckets = response.aggregations()
        .get("categories")
        .sterms()
        .buckets()
        .array();
    
    for (StringTermsBucket bucket : buckets) {
        result.put(bucket.key(), bucket.docCount());
    }
    
    return result;
}

7. 最佳实践

  1. 批量操作: 使用 bulk API 进行批量索引、更新或删除操作
  2. 分页查询: 实现分页以处理大量结果
  3. 错误处理: 添加适当的异常处理和重试机制
  4. 索引别名: 使用索引别名进行无缝索引迁移
  5. 定期优化: 定期执行索引优化操作

8. 安全注意事项

你的配置文件中包含明文密码,建议:

  1. 使用环境变量或外部配置服务存储敏感信息
  2. 在生产环境中使用适当的证书验证,而不是信任所有证书
  3. 限制 Elasticsearch 用户的权限

9. 故障排除

常见问题:

  1. 连接问题: 检查主机、端口和凭据
  2. 映射冲突: 确保字段类型一致
  3. 查询性能: 使用分析器调整查询性能
  4. 内存问题: 监控 JVM 堆使用情况

10. 进阶主题

  1. 集群设置: 配置多节点集群
  2. 分片和副本: 优化分片和副本策略
  3. 自定义分析器: 创建自定义分析器以改进搜索
  4. 地理空间搜索: 实现地理位置搜索功能
  5. 向量搜索: 实现向量搜索和相似度查询

通过这个指南,你应该能够开始使用你的 Elasticsearch 应用程序,并了解如何扩展它的功能。


http://www.kler.cn/a/599970.html

相关文章:

  • Maven 简介及其核心概念
  • ctfshow WEB web2
  • Proximal Policy Optimization(PPO)算法
  • 中信银行太原长治路支行赴老年活动服务中心开展专题金融知识宣讲
  • Jackson实现JSON数据的合并
  • 【GoLang】调用llm时提示词prompt的介绍以及使用方式
  • 信奥赛CSP-J复赛集训(模拟算法专题)(31):P2692 覆盖
  • Rust语言的无服务器架构
  • Leetcode-100 贪心算法
  • 【40】单片机编程核心技巧:static 的重要作用
  • 组件日志——etcd
  • 山东电专--自动化刷课
  • 前缀树学习
  • 深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
  • NO.56|基础算法-模拟|多项式输出|蛇形方阵|字符串的展开|方向向量(C++)
  • 《HarmonyOS Next自定义TabBar页签凸起和凹陷案例与代码》
  • 蓝桥杯—草坪(模拟+bfs分层处理)
  • 【计算机网络运输层详解】
  • 常见框架漏洞—Spring
  • 深度学习篇---PaddleDetectionPaddleOCR