從 4.3.x 升級至 4.4.x
本節說明從 4.3.x 版到 4.4.x 版的重大變更,以及如何用新引入的功能取代已移除的功能。
重大變更
移除已棄用的類別
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
類別已被移除。這是使用 TransportClient
的 ElasticsearchOperations
介面的實作。必須使用命令式 ElasticsearchRestTemplate
或反應式 ReactiveElasticsearchTemplate
建立與 Elasticsearch 的連線。
套件變更
在 4.3 中,有兩個類別(ElasticsearchAggregations
和 ElasticsearchAggregation
)已移至 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 名稱 elasticsearchOperations 和 elasticsearchTemplate 取得,它使用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 名稱 reactiveElasticsearchOperations 和 reactiveElasticsearchTemplate 取得,它使用ReactiveElasticsearchClient