问题描述

spring boot升级了,发现不支持6.X版本的elasticsearch。
根本原因是elasticsearch的7.X去掉了document type定义,每个document只有一个type。
spring boot是工程的基础,不能更改版本,只能更改spring-data-elasticsearch的版本。

生效的配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/>
    </parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-elasticsearch</artifactId>
			<version>3.2.13.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>transport</artifactId>
			<version>6.8.14</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.plugin</groupId>
			<artifactId>transport-netty4-client</artifactId>
			<version>6.8.14</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>6.8.14</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>6.8.14</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-client</artifactId>
			<version>6.8.14</version>
		</dependency>
	</dependencies>

问题

spring boot对于elasticsearch的支持

官方文档

版本:

Spring Data Release TrainSpring Data ElasticsearchElasticsearchSpring FrameworkSpring Boot

2021.0 (Pascal)

4.2.1

7.12.1

5.3.7

2.5.x

2020.0 (Ockham)

4.1.x

7.9.3

5.3.2

2.4.x

Neumann

4.0.x

7.6.2

5.2.12

2.3.x

Moore

3.2.x

6.8.12

5.2.12

2.2.x

Lovelace

3.1.x

6.2.2

5.1.19

2.1.x

Kay

3.0.x

5.5.0

5.0.13

2.0.x

Ingalls

2.1.x

2.4.0

4.3.25

1.5.x

官方集成方式

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

默认继承parent中elasticsearch的版本定义。
曾经尝试直接更改spring-boot-starter-data-elasticsearch的版本,如下配置。

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

虽然spring-boot-starter-data-elasticsearch的版本发生了变化,但是transport, transport-netty4-client,elasticsearch-rest-high-level-client,elasticsearch,elasticsearch-rest-client的版本依旧是最新的版本。
what?第一种方式失败。

追溯

查看spring boot中的配置,发现在spring-boot-dependencies中直接定义了elasticsearch的版本,而不是在spring-boot-starter-data-elasticsearch中定义。


    <elasticsearch.version>7.6.2</elasticsearch.version>
    
    
      <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>${elasticsearch.version}</version>
      </dependency>
      <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>${elasticsearch.version}</version>
      </dependency>
      <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>${elasticsearch.version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>${elasticsearch.version}</version>
      </dependency>
      <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>${elasticsearch.version}</version>
        <exclusions>
          <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
          </exclusion>
        </exclusions>
      </dependency>

因此,更改spring-boot-starter-data-elasticsearch的版本并没有什么用。

解决问题

spring boot的继承关系:
spring-boot-starter-data-elasticsearch -》
spring-data-elasticsearch -》实际实现
因此spring-boot-starter-data-elasticsearch本身没有任何实现,所以将其抛弃,直接使用spring-data-elasticsearch。
鉴于maven的最短路径原则,需要在自己的pom中重新定义elasticsearch的版本,所以得出了上面的结论。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐