ElasticSearch8.x+SpringBoot3.X联调踩坑指南

前言:

最近想着体验一下ES8,于是在服务器上使用docker镜像进行了搭建。在正确配置服务器入站规则+本地浏览器可以访问URL的情况下,使用RestHighLevelClient的API始终无法正确连接,提示"找不到主机名"。

经过长达两个小时的折腾,我归纳出一些你可能会踩下的坑。

在此之前:请跟着我回顾我的操作

1.ElasticSearch的部署

1. 拉取镜像

bash 复制代码
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:8.6.2

2. 创建挂载目录

bash 复制代码
mkdir -p ~/es_data/{data,logs,config}
chmod -R 777 ~/es_data

3. 启动容器

ruby 复制代码
docker run -d 
  --name elasticsearch 
  -p 9200:9200 
  -p 9300:9300 
  -e "discovery.type=single-node" 
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 
  -e "xpack.security.enabled=false" 
  -v ~/es_data/data:/usr/share/elasticsearch/data 
  -v ~/es_data/logs:/usr/share/elasticsearch/logs 
  --restart=unless-stopped 
  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:8.6.2

请关注 -e "xpack.security.enabled=false" 这一行:指的是在测试环境中不必开启密钥校验,你一定要加上这一行,这样可以确保你在本地可以顺利连接。从而规避SSL对你的约束。

4. 验证安装

sql 复制代码
curl -X GET "localhost:9200"

2.入站处理和出站处理

注意要对我们在docker启动命令中使用的端口,进行入站的运行放行。我们的出站安全组是All,因此不做多的阐述

3.最关键的部分------SDK的选取

如果你希望使用ElasticSearch8.x的版本,请你务必使用 JDK17 JDK17 JDK17.

同时将你的SpringBoot版本升级到 3.2.x

因为Spring2.x的版本 是不支持 Es8的连接的

你需要在pom部分配置以下内容

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

<!-- Elasticsearch Java Client -->
<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.12.0</version>
</dependency>

'''

同时在Application.yml部分配置以下内容:

yaml 复制代码
spring:
 
  elasticsearch:
    uris: http://x.x.x.x:9200

这里我会给出我自己的测试用例代码:

less 复制代码
package com.xiaoyongcai.io.pikapika.ElasticSearchTest.Controller;
​
import com.xiaoyongcai.io.pikapika.ElasticSearchTest.Model.Product;
import com.xiaoyongcai.io.pikapika.ElasticSearchTest.Service.ProductService;
import org.springframework.web.bind.annotation.*;
import lombok.RequiredArgsConstructor;
import java.util.List;
​
@RestController
@RequestMapping("/api/products")
@RequiredArgsConstructor
public class ProductController {
    private final ProductService productService;
​
    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return productService.saveProduct(product);
    }
​
    @GetMapping("/{id}")
    public Product getProduct(@PathVariable String id) {
        return productService.findById(id);
    }
​
    @GetMapping("/search")
    public List<Product> searchProducts(@RequestParam("name") String name) {
        return productService.searchByName(name);
    }
​
    @DeleteMapping("/{id}")
    public void deleteProduct(@PathVariable String id) {
        productService.deleteProduct(id);
    }
}
kotlin 复制代码
package com.xiaoyongcai.io.pikapika.ElasticSearchTest.Model;
​
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import lombok.Data;
​
@Data
@Document(indexName = "products")  // 索引名
public class Product {
    @Id
    private String id;
​
    @Field(type = FieldType.Text, analyzer = "standard")  // 文本类型,使用标准分词器
    private String name;
​
    @Field(type = FieldType.Double)
    private Double price;
​
    @Field(type = FieldType.Keyword)  // 不分词的关键字类型
    private String category;
}
java 复制代码
package com.xiaoyongcai.io.pikapika.ElasticSearchTest.Repository;
​
import com.xiaoyongcai.io.pikapika.ElasticSearchTest.Model.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
​
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
    // 自定义查询方法(根据字段名自动推导)
    List<Product> findByName(String name);
    List<Product> findByPriceBetween(Double minPrice, Double maxPrice);
}
typescript 复制代码
package com.xiaoyongcai.io.pikapika.ElasticSearchTest.Service;
​
import com.xiaoyongcai.io.pikapika.ElasticSearchTest.Model.Product;
import com.xiaoyongcai.io.pikapika.ElasticSearchTest.Repository.ProductRepository;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import java.util.List;
​
@Service
@RequiredArgsConstructor
public class ProductService {
    private final ProductRepository productRepository;
​
    public Product saveProduct(Product product) {
        return productRepository.save(product);
    }
​
    public Product findById(String id) {
        return productRepository.findById(id).orElse(null);
    }
​
    public List<Product> searchByName(String name) {
        return productRepository.findByName(name);
    }
​
    public void deleteProduct(String id) {
        productRepository.deleteById(id);
    }
}
相关推荐
GoGeekBaird5 小时前
69天探索操作系统-第66天:为现代操作系统设计高级实时进程间通信机制
后端·操作系统
还是鼠鼠5 小时前
单元测试-概述&入门
java·开发语言·后端·单元测试·log4j·maven
我最厉害。,。7 小时前
接口安全&SOAP&OpenAPI&RESTful&分类特征导入&项目联动检测
后端·restful
AntBlack9 小时前
计算机视觉 : 端午无事 ,图像处理入门案例一文速通
后端·python·计算机视觉
福大大架构师每日一题10 小时前
2025-06-02:最小可整除数位乘积Ⅱ。用go语言,给定一个表示正整数的字符串 num 和一个整数 t。 定义:如果一个整数的每一位都不是 0,则称该整数为
后端
Code_Artist10 小时前
[Mybatis] 因 0 != null and 0 != '' 酿成的事故,害得我又过点啦!
java·后端·mybatis
程序员博博10 小时前
看到这种代码,我直接气到想打人
后端
南雨北斗11 小时前
php 图片压缩函数
后端
L2ncE11 小时前
ES101系列08 | 数据建模和索引重建
java·后端·elasticsearch
还是鼠鼠11 小时前
Maven---配置本地仓库
java·开发语言·后端·maven