從 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
介面的實現。連線到 Elasticsearch 必須使用命令式 ElasticsearchRestTemplate
或響應式 ReactiveElasticsearchTemplate
。
包變更
在 4.3 版本中,為整合新的 Elasticsearch 客戶端,有兩個類(ElasticsearchAggregations
和 ElasticsearchAggregation
)曾被移至 org.springframework.data.elasticsearch.core.clients.elasticsearch7
包。現已將它們移回 org.springframework.data.elasticsearch.core
包,因為我們保留了使用舊 Elasticsearch 客戶端的類在原來的位置。
行為變更
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 客戶端中仍有一些需要解決的 bug
-
由於投入資源有限,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 應用上下文中將提供以下 bean:
-
一個
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();
}
}
透過此配置,Spring 應用上下文中將提供以下 bean:
-
一個
RestClient
bean,它是配置的由 Elasticsearch 客戶端使用的底層RestClient
-
一個
ReactiveElasticsearchClient
bean,這是使用RestClient
的新響應式客戶端 -
一個
ReactiveElasticsearchOperations
bean,可用 bean 名稱為 reactiveElasticsearchOperations 和 reactiveElasticsearchTemplate,它使用ReactiveElasticsearchClient