從 4.3.x 升級至 4.4.x

本節說明從 4.3.x 版到 4.4.x 版的重大變更,以及如何用新引入的功能取代已移除的功能。

棄用

org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations

方法 <T> Publisher<T> execute(ClientCallback<Publisher<T>> callback) 已被棄用。由於現在有多個使用不同用戶端程式庫的實作,因此 execute 方法在不同的實作中仍然可用,但介面中不再有該方法,因為不同用戶端沒有通用的回呼介面。

重大變更

移除已棄用的類別

org.springframework.data.elasticsearch.core.ElasticsearchTemplate 已被移除

從 4.4 版開始,Spring Data Elasticsearch 不再使用 Elasticsearch 的 TransportClient(其本身自 Elasticsearch 7.0 起已被棄用)。這表示自 Spring Data Elasticsearch 4.0 起已被棄用的 org.springframework.data.elasticsearch.core.ElasticsearchTemplate 類別已被移除。這是使用 TransportClientElasticsearchOperations 介面的實作。必須使用命令式 ElasticsearchRestTemplate 或反應式 ReactiveElasticsearchTemplate 建立與 Elasticsearch 的連線。

套件變更

在 4.3 中,有兩個類別(ElasticsearchAggregationsElasticsearchAggregation)已移至 org.springframework.data.elasticsearch.core.clients.elasticsearch7 套件,以準備整合新的 Elasticsearch 用戶端。由於我們保留類別使用舊的 Elasticsearch 用戶端,因此它們已移回 org.springframework.data.elasticsearch.core 套件。

行為變更

ReactiveElasticsearchTemplate 在直接建立或透過 Spring Boot 組態建立時,預設重新整理策略為 IMMEDIATE。這可能會導致大量索引編制時的效能問題,並且與 Elasticsearch 的預設行為不同。現在已將其變更為預設重新整理策略為 NONE。當使用組態(如反應式 REST 用戶端中所述)提供 ReactiveElasticsearchTemplate 時,預設重新整理策略已設定為 NONE。

新的 Elasticsearch 用戶端

Elasticsearch 推出了新的 ElasticsearchClient 並棄用了之前的 RestHighLevelClient。Spring Data Elasticsearch 4.4 仍然使用舊的用戶端作為預設用戶端,原因如下:

  • 新的用戶端強制應用程式使用 jakarta.json.spi.JsonProvider 套件,而 Spring Boot 在 3 版之前將堅持使用 javax.json.spi.JsonProvider。因此,在 Spring Data Elasticsearch 中切換預設實作只能在 Spring Data Elasticsearch 5(Spring Data 3、Spring 6)中實現。

  • Elasticsearch 用戶端中仍然存在一些需要解決的錯誤

  • 由於資源有限,Spring Data Elasticsearch 中使用新用戶端的實作尚未完成 - 請記住,Spring Data Elasticsearch 是一個社群驅動的專案,仰賴公眾的貢獻。

如何使用新的用戶端

使用新用戶端的實作尚未完成,某些操作將拋出 java.lang.UnsupportedOperationException 或可能拋出 NPE(例如,當 Elasticsearch 無法剖析來自伺服器的回應時,這種情況仍然偶爾發生)
使用新的用戶端測試實作,但尚勿在生產程式碼中使用!

為了嘗試使用新的用戶端,需要執行以下步驟:

確保不組態現有的預設用戶端

如果使用 Spring Boot,請從自動組態中排除 Spring Data Elasticsearch

@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class)
public class SpringdataElasticTestApplication {
	// ...
}

從應用程式組態中移除 Spring Data Elasticsearch 相關屬性。如果 Spring Data Elasticsearch 是使用程式化組態(請參閱Elasticsearch 用戶端)組態的,請從 Spring 應用程式內容中移除這些 Bean。

新增相依性

新的 Elasticsearch 用戶端的相依性在 Spring Data Elasticsearch 中仍然是選用的,因此需要明確新增它們

<dependencies>
    <dependency>
        <groupId>co.elastic.clients</groupId>
        <artifactId>elasticsearch-java</artifactId>
        <version>7.17.3</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId> <!-- is Apache 2-->
        <version>7.17.3</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

當使用 Spring Boot 時,需要在 pom.xml 中設定以下屬性。

<properties>
    <jakarta-json.version>2.0.1</jakarta-json.version>
</properties>

新的組態類別

命令式樣式

為了組態 Spring Data Elasticsearch 以使用新的用戶端,需要建立一個衍生自 org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration 的組態 Bean

@Configuration
public class NewRestClientConfig extends ElasticsearchConfiguration {

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder() //
			.connectedTo("localhost:9200") //
			.build();
	}
}

組態方式與舊用戶端相同,但不再需要建立多個組態 Bean。透過此組態,以下 Bean 將在 Spring 應用程式內容中可用:

  • 一個 RestClient Bean,它是 Elasticsearch 用戶端使用的已組態低階 RestClient

  • 一個 ElasticsearchClient Bean,這是使用 RestClient 的新用戶端

  • 一個 ElasticsearchOperations Bean,可透過 Bean 名稱 elasticsearchOperationselasticsearchTemplate 取得,它使用 ElasticsearchClient

反應式樣式

若要在反應式環境中使用新的用戶端,唯一的差異是衍生組態的類別

@Configuration
public class NewRestClientConfig extends ReactiveElasticsearchConfiguration {

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder() //
			.connectedTo("localhost:9200") //
			.build();
	}
}

透過此組態,以下 Bean 將在 Spring 應用程式內容中可用:

  • 一個 RestClient Bean,它是 Elasticsearch 用戶端使用的已組態低階 RestClient

  • 一個 ReactiveElasticsearchClient Bean,這是使用 RestClient 的新反應式用戶端

  • 一個 ReactiveElasticsearchOperations Bean,可透過 Bean 名稱 reactiveElasticsearchOperationsreactiveElasticsearchTemplate 取得,它使用 ReactiveElasticsearchClient