從 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。當 ReactiveElasticsearchTemplate 透過 響應式 REST 客戶端 中描述的配置提供時,預設重新整理策略已設定為 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。
新增依賴
Spring Data Elasticsearch 中新 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 應用程式上下文中可用
-
一個
RestClientbean,它是 Elasticsearch 客戶端使用的已配置的低階RestClient -
一個
ElasticsearchClientbean,這是使用RestClient的新客戶端 -
一個
ElasticsearchOperationsbean,可用 bean 名稱為 elasticsearchOperations 和 elasticsearchTemplate,它使用ElasticsearchClient
響應式風格
要在響應式環境中使用新客戶端,唯一的區別是配置的派生類
@Configuration
public class NewRestClientConfig extends ReactiveElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() //
.connectedTo("localhost:9200") //
.build();
}
}
透過此配置,以下 bean 將在 Spring 應用程式上下文中可用
-
一個
RestClientbean,它是 Elasticsearch 客戶端使用的已配置的低階RestClient -
一個
ReactiveElasticsearchClientbean,這是使用RestClient的新響應式客戶端 -
一個
ReactiveElasticsearchOperationsbean,可用 bean 名稱為 reactiveElasticsearchOperations 和 reactiveElasticsearchTemplate,它使用ReactiveElasticsearchClient