SpringBoot集成ElasticSearch遇到的坑!!!

本文详细介绍了在SpringBoot项目中集成Elasticsearch 5.x版本的注意事项及解决方案,包括依赖配置、版本冲突问题及如何正确配置ES客户端。

第一是为了记录采坑。
第二是为了“同道中人”,少走弯路!
一、注意你的ES版本,版本,版本【重要的事情说三遍!】
SpringBoot的ES依赖:

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

记得没错此依赖只针对的是6.0版本以上ES,6.0版本以下ES不适用于SpringBoot的依赖。
举例:我们公司的线上ES版本为5.4.2,但是我刚开始集成的时候,使用了SpringBoot的依赖配置信息如下

spring:
    cluster-nodes: 公司ES的IP地址,注意端口号不是9200而是9300!!
    cluster-name: 这是你的ES的名称,打开ES页面后"cluster_name"参数的值
    elasticsearch:
      repositories:
        enabled: true

导致在启动后,报错无法找到ES,None of the configured nodes are available。哎,这个问题坑死!!!只要你仔细核对了cluster-nodes参数,cluster-name参数没有问题,那绝对是版本问题,你需要自己手动配置依赖!
公司的ES版本为5.4.2你的依赖就要是

		<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.4.2</version>
        </dependency>
        <!-- 尤其是要注意这里!下面的三个依赖,需要你打开ES页面,
        	查看lucene_version参数的版本,要一一对应!!!! -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>6.5.1</version>
        </dependency>
        <!-- https://mvnrepository.com/art... -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-highlighter</artifactId>
            <version>6.5.1</version>
        </dependency>
        <!-- https://mvnrepository.com/art... -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queries</artifactId>
            <version>6.5.1</version>
        </dependency>

另附一个图:
在这里插入图片描述
总结:个人建议还是自己老老实实配比较好,不要去用SpringBoot的ES依赖。。除非你的版本比较高吧。。。

-------------------------------分隔符------------------------------------

后面找到了一个兼容ES5、ES6的工具,叫Jest。具体如何使用可以看我另一篇文章:Java连接操作ElasticSearch工具类(含ES装了SQL插件的方式 支持5.0+6.0+)

-------------------------------分隔符------------------------------------

二、接着上面我说的自己配依赖的问题的坑!
确实自己配依赖是繁琐了点,但是在用SpringBoot的依赖,是越跑越远。。。。
自己配依赖也遇到了个坑。。。。
上面说的那4个自己配的依赖,copy到不同的项目中,版本号会自动变???!!!

在这里插入图片描述
在这里插入图片描述
怎么发现这个问题的呢,因为我自己手写了一个ES的配置类:

package com.es.util;

import java.net.InetAddress;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;

public class EsClient {
    public final static String HOST = "127.0.0.1";

    public TransportClient client = null;

    public final static int PORT = 9300;

    /**
     * 获取客户端连接信息
     *
     * @return void
     * @Title: getConnect
     */
    @SuppressWarnings({"resource", "unchecked"})
    public void getConnect() {
        try {
            //如果使用集群名称不是默认的“elasticsearch”,则必须设置集群名称, 通过对Settings经行设置
            /*Settings settings = Settings.builder()
                    .put("cluster.name", "elasticsearch").build();*/
            /*TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName(HOST), PORT));
            client.close();*/
            TransportClient client = null;
            PreBuiltTransportClient preBuiltTransportClient = null;
            // 设置集群名称
            Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
            // 创建client
            preBuiltTransportClient = new PreBuiltTransportClient(settings);
            client = preBuiltTransportClient
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), 9300));
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭连接
     *
     * @return void
     * @Title: closeConnect
     */
    public void closeConnect() {
        if (null != client) {
            client.close();
        }
    }

    public static void main(String[] args) {
        EsClient esClient = new EsClient();
        esClient.getConnect();
    }
}

在SpringBoot项目中,我复制过来Maven的Demo代码时,InetSocketTransportAddress类,爆红了。
百度了一番知道,在6.0以上版本中,InetSocketTransportAddress类被删除了,不在使用它创建链接了,而是使用TransportAddress类。
好的,知道了,但是为什么依赖一模一样,我的版本设置的是5.4.2。。。在SpringBoot中自动变成了6.0呢,一度有点觉得不可能,因为我是指定版本,并没有用starter。。但是百度也没有找到答案,所以我个人理解,可能是因为相同的依赖SpringBoot会识别到,他们那里有,就不去Maven仓库下载了。不这么想会一晚上睡不着。。所以有朋友知道为什么,也可以告我一下,谢谢

解决办法:将自己的ES依赖,先弄出来,再一键导入的SpringBoot项目中,也就说,我不写什么dependency了,我自己导入JAR,你管得着我吗??哈哈。。。。但是确实累!59个jar。。我去。。。

另附一个下载JAR的链接:
https://download.youkuaiyun.com/download/remember__peng/11633909
所有6.0以下版本的ES都可以使用,全部导入项目中,并把上面那个工具类复制下来即可。

<think>好的,用户想在Spring Boot中集成Elasticsearch 7.11.2,需要配置方法和教程。首先,我需要确认Spring Boot和Elasticsearch的版本兼容性。根据经验,Spring Data Elasticsearch的版本需要与Elasticsearch的版本对应。比如,Elasticsearch 7.11.2可能需要Spring Data Elasticsearch 4.2.x,而对应的Spring Boot版本可能是2.4.x或2.5.x。用户可能使用的是较新的Spring Boot版本,但需要注意兼容性。 接下来,用户可能需要详细的步骤,包括Maven依赖配置、配置文件设置、实体类映射、Repository接口创建以及如何测试连接。需要检查用户提供的引用内容是否有相关帮助,但之前的引用[1]和[2]涉及的是Spark和Maven生成项目结构,可能不太相关,不过引用[2]中的Maven部分可以用到,比如如何添加依赖。 另外,用户可能遇到常见问题,比如版本不匹配导致连接失败,或者配置错误。需要提醒用户检查ES的地址和端口是否正确,以及是否启用了自动配置。可能还需要提供示例代码,比如配置类或者测试用例,确保用户能正确操作。 还要考虑是否需要使用RestHighLevelClient还是新的Elasticsearch Java Client。在Spring Boot中,通常推荐使用Spring Data Elasticsearch的Repository支持,但需要确认7.11.2是否兼容。如果用户使用的是较新的Spring Boot版本,可能需要调整依赖项,比如使用spring-boot-starter-data-elasticsearch,并排除掉旧版本的Elasticsearch客户端,以避免冲突。 最后,生成的相关问题需要围绕集成后的应用场景、高级配置、性能优化以及数据迁移等方面,帮助用户进一步探索。</think>### Spring Boot集成Elasticsearch 7.11.2配置指南 #### 一、版本兼容性验证 Spring Boot 2.4.x/2.5.x 对应 Spring Data Elasticsearch 4.2.x,官方兼容Elasticsearch 7.11.2[^3]。建议使用以下依赖组合: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.5.6</version> <!-- 对应Spring Data Elasticsearch 4.2.6 --> </dependency> ``` #### 二、核心配置步骤 1. **Maven依赖配置** ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.11.2</version> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **application.yml配置** ```yaml spring: elasticsearch: rest: uris: http://localhost:9200 username: elastic password: your_password ``` 3. **Java配置类示例** ```java @Configuration public class ElasticConfig { @Bean public RestHighLevelClient elasticsearchClient() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "your_password")); RestClientBuilder builder = RestClient.builder( new HttpHost("localhost", 9200, "http")) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); return new RestHighLevelClient(builder); } } ``` #### 三、实体映射配置 ```java @Document(indexName = "products") public class Product { @Id private String id; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String name; @Field(type = FieldType.Double) private Double price; // getters/setters省略 } ``` #### 四、Repository接口示例 ```java public interface ProductRepository extends ElasticsearchRepository<Product, String> { List<Product> findByPriceBetween(Double minPrice, Double maxPrice); } ``` #### 五、验证连接的测试用例 ```java @SpringBootTest public class ElasticsearchConnectionTest { @Autowired private RestHighLevelClient client; @Test void testClusterHealth() throws IOException { ClusterHealthResponse response = client.cluster().health( new ClusterHealthRequest(), RequestOptions.DEFAULT); assertEquals(ClusterHealthStatus.GREEN, response.getStatus()); } } ```
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值