From b9eed8eaa42429a35d020a41548ef418a326ead0 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sun, 1 Dec 2024 12:31:57 +0100 Subject: [PATCH 1/2] Upgrade to Elasticsearch 8.1.6.1 --- pom.xml | 2 +- .../modules/ROOT/pages/elasticsearch/elasticsearch-new.adoc | 6 +++++- .../antora/modules/ROOT/pages/elasticsearch/versions.adoc | 4 ++-- src/test/resources/testcontainers-elasticsearch.properties | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 498aa9bdd..8d4a07dae 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 3.5.0-SNAPSHOT - 8.15.3 + 8.16.1 0.19.0 2.23.1 diff --git a/src/main/antora/modules/ROOT/pages/elasticsearch/elasticsearch-new.adoc b/src/main/antora/modules/ROOT/pages/elasticsearch/elasticsearch-new.adoc index 5eb6ae594..53990f678 100644 --- a/src/main/antora/modules/ROOT/pages/elasticsearch/elasticsearch-new.adoc +++ b/src/main/antora/modules/ROOT/pages/elasticsearch/elasticsearch-new.adoc @@ -1,13 +1,17 @@ [[new-features]] = What's new +[[new-features.5-5-0]] +== New in Spring Data Elasticsearch 5.5 +* Upgrade to Elasticsearch 8.16.1. + [[new-features.5-4-0]] == New in Spring Data Elasticsearch 5.4 * Upgrade to Elasticsearch 8.15.3. * Allow to customize the mapped type name for `@InnerField` and `@Field` annotations. * Support for Elasticsearch SQL. -* Add support for retrieving request executionDuration. +* Add support for retrieving request executionDuration. [[new-features.5-3-0]] == New in Spring Data Elasticsearch 5.3 diff --git a/src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc b/src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc index 1b6d630c4..962dd82aa 100644 --- a/src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc +++ b/src/main/antora/modules/ROOT/pages/elasticsearch/versions.adoc @@ -6,8 +6,8 @@ The following table shows the Elasticsearch and Spring versions that are used by [cols="^,^,^,^",options="header"] |=== | Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework -| 2025.0 (in development) | 5.5.x | 8.15.3 | 6.2.x -| 2024.1 | 5.4.x | 8.15.3 | 6.1.x +| 2025.0 (in development) | 5.5.x | 8.16.1 | 6.2.x +| 2024.1 | 5.4.x | 8.15.5 | 6.1.x | 2024.0 | 5.3.x | 8.13.4 | 6.1.x | 2023.1 (Vaughan) | 5.2.xfootnote:oom[Out of maintenance] | 8.11.1 | 6.1.x | 2023.0 (Ullmann) | 5.1.xfootnote:oom[] | 8.7.1 | 6.0.x diff --git a/src/test/resources/testcontainers-elasticsearch.properties b/src/test/resources/testcontainers-elasticsearch.properties index 9d1fb89d5..3f55e3381 100644 --- a/src/test/resources/testcontainers-elasticsearch.properties +++ b/src/test/resources/testcontainers-elasticsearch.properties @@ -15,7 +15,7 @@ # # sde.testcontainers.image-name=docker.elastic.co/elasticsearch/elasticsearch -sde.testcontainers.image-version=8.15.3 +sde.testcontainers.image-version=8.16.1 # # # needed as we do a DELETE /* at the end of the tests, will be required from 8.0 on, produces a warning since 7.13 From 6a50a0e9d67e48be892581a6d06748f50678be3f Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sun, 1 Dec 2024 13:41:23 +0100 Subject: [PATCH 2/2] Upgrade to Elasticsearch 8.16.1 Closes #3017 --- .../elc/AutoCloseableElasticsearchClient.java | 9 ++++-- .../client/elc/ElasticsearchClients.java | 2 +- .../elc/ElasticsearchConfiguration.java | 2 +- .../elc/ReactiveElasticsearchClient.java | 14 +++++++--- .../ReactiveElasticsearchConfiguration.java | 2 +- .../client/elc/RequestConverter.java | 28 +++++++++++-------- .../highlight/HighlightCommonParameters.java | 8 ++++++ .../core/SearchOperationsExtensions.kt | 4 +-- .../elasticsearch/client/elc/DevTests.java | 2 +- 9 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/AutoCloseableElasticsearchClient.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/AutoCloseableElasticsearchClient.java index fe6afc148..9a074b4a2 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/AutoCloseableElasticsearchClient.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/AutoCloseableElasticsearchClient.java @@ -18,6 +18,8 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.transport.ElasticsearchTransport; +import java.io.IOException; + import org.elasticsearch.client.RestClient; import org.springframework.util.Assert; @@ -36,7 +38,10 @@ public AutoCloseableElasticsearchClient(ElasticsearchTransport transport) { } @Override - public void close() throws Exception { - transport.close(); + public void close() throws IOException { + // since Elasticsearch 8.16 the ElasticsearchClient implements (through ApiClient) the Closeable interface and + // handles closing of the underlying transport. We now just call the base class, but keep this as we + // have been implementing AutoCloseable since 4.4 and won't change that to a mere Closeable + super.close(); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java index 85620fe20..d331f36c1 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchClients.java @@ -329,7 +329,7 @@ public static ElasticsearchTransport getElasticsearchTransport(RestClient restCl Assert.notNull(jsonpMapper, "jsonpMapper must not be null"); TransportOptions.Builder transportOptionsBuilder = transportOptions != null ? transportOptions.toBuilder() - : new RestClientOptions(RequestOptions.DEFAULT).toBuilder(); + : new RestClientOptions(RequestOptions.DEFAULT, false).toBuilder(); RestClientOptions.Builder restClientOptionsBuilder = getRestClientOptionsBuilder(transportOptions); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchConfiguration.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchConfiguration.java index a0632d557..28bcbeca7 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchConfiguration.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchConfiguration.java @@ -135,6 +135,6 @@ public JsonpMapper jsonpMapper() { * @return the options that should be added to every request. Must not be {@literal null} */ public TransportOptions transportOptions() { - return new RestClientOptions(RequestOptions.DEFAULT); + return new RestClientOptions(RequestOptions.DEFAULT, false); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchClient.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchClient.java index 958b1f59f..c77159f38 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchClient.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchClient.java @@ -27,6 +27,7 @@ import co.elastic.clients.util.ObjectBuilder; import reactor.core.publisher.Mono; +import java.io.IOException; import java.util.function.Function; import org.springframework.lang.Nullable; @@ -56,8 +57,11 @@ public ReactiveElasticsearchClient withTransportOptions(@Nullable TransportOptio } @Override - public void close() throws Exception { - transport.close(); + public void close() throws IOException { + // since Elasticsearch 8.16 the ElasticsearchClient implements (through ApiClient) the Closeable interface and + // handles closing of the underlying transport. We now just call the base class, but keep this as we + // have been implementing AutoCloseable since 4.4 and won't change that to a mere Closeable + super.close(); } // region child clients @@ -127,7 +131,8 @@ public Mono> get(GetRequest request, Class tClass) { // java.lang.Class) // noinspection unchecked JsonEndpoint, ErrorResponse> endpoint = (JsonEndpoint, ErrorResponse>) GetRequest._ENDPOINT; - endpoint = new EndpointWithResponseMapperAttr<>(endpoint, "co.elastic.clients:Deserializer:_global.get.Response.TDocument", + endpoint = new EndpointWithResponseMapperAttr<>(endpoint, + "co.elastic.clients:Deserializer:_global.get.Response.TDocument", getDeserializer(tClass)); return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions)); @@ -172,7 +177,8 @@ public Mono> mget(MgetRequest request, Class clazz) { // noinspection unchecked JsonEndpoint, ErrorResponse> endpoint = (JsonEndpoint, ErrorResponse>) MgetRequest._ENDPOINT; - endpoint = new EndpointWithResponseMapperAttr<>(endpoint, "co.elastic.clients:Deserializer:_global.mget.Response.TDocument", + endpoint = new EndpointWithResponseMapperAttr<>(endpoint, + "co.elastic.clients:Deserializer:_global.mget.Response.TDocument", this.getDeserializer(clazz)); return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions)); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchConfiguration.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchConfiguration.java index 6117f2830..6414fcb80 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchConfiguration.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchConfiguration.java @@ -125,6 +125,6 @@ public JsonpMapper jsonpMapper() { * @return the options that should be added to every request. Must not be {@literal null} */ public TransportOptions transportOptions() { - return new RestClientOptions(RequestOptions.DEFAULT).toBuilder().build(); + return new RestClientOptions(RequestOptions.DEFAULT, false).toBuilder().build(); } } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java index ec934452e..20670bff3 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java @@ -51,6 +51,7 @@ import co.elastic.clients.elasticsearch.indices.ExistsIndexTemplateRequest; import co.elastic.clients.elasticsearch.indices.ExistsRequest; import co.elastic.clients.elasticsearch.indices.update_aliases.Action; +import co.elastic.clients.elasticsearch.sql.query.SqlFormat; import co.elastic.clients.json.JsonData; import co.elastic.clients.json.JsonpDeserializer; import co.elastic.clients.json.JsonpMapper; @@ -533,17 +534,22 @@ public co.elastic.clients.elasticsearch.indices.GetTemplateRequest indicesGetTem public co.elastic.clients.elasticsearch.sql.QueryRequest sqlQueryRequest(SqlQuery query) { Assert.notNull(query, "Query must not be null."); - return co.elastic.clients.elasticsearch.sql.QueryRequest.of(sqb -> { - sqb.query(query.getQuery()).catalog(query.getCatalog()).columnar(query.getColumnar()).cursor(query.getCursor()) - .fetchSize(query.getFetchSize()).fieldMultiValueLeniency(query.getFieldMultiValueLeniency()) - .indexUsingFrozen(query.getIndexIncludeFrozen()).keepAlive(time(query.getKeepAlive())) - .keepOnCompletion(query.getKeepOnCompletion()).pageTimeout(time(query.getPageTimeout())) - .requestTimeout(time(query.getRequestTimeout())) - .waitForCompletionTimeout(time(query.getWaitForCompletionTimeout())).filter(getQuery(query.getFilter(), null)) - .timeZone(Objects.toString(query.getTimeZone(), null)).format("json"); - - return sqb; - }); + return co.elastic.clients.elasticsearch.sql.QueryRequest.of(sqb -> sqb + .query(query.getQuery()) + .catalog(query.getCatalog()) + .columnar(query.getColumnar()) + .cursor(query.getCursor()) + .fetchSize(query.getFetchSize()) + .fieldMultiValueLeniency(query.getFieldMultiValueLeniency()) + .indexUsingFrozen(query.getIndexIncludeFrozen()) + .keepAlive(time(query.getKeepAlive())) + .keepOnCompletion(query.getKeepOnCompletion()) + .pageTimeout(time(query.getPageTimeout())) + .requestTimeout(time(query.getRequestTimeout())) + .waitForCompletionTimeout(time(query.getWaitForCompletionTimeout())) + .filter(getQuery(query.getFilter(), null)) + .timeZone(Objects.toString(query.getTimeZone(), null)) + .format(SqlFormat.Json)); } // endregion diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/highlight/HighlightCommonParameters.java b/src/main/java/org/springframework/data/elasticsearch/core/query/highlight/HighlightCommonParameters.java index a63185bbc..1541d9f95 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/highlight/HighlightCommonParameters.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/highlight/HighlightCommonParameters.java @@ -80,6 +80,10 @@ public String getBoundaryScannerLocale() { return boundaryScannerLocale; } + /** + * @deprecated the underlying functionality is deprecated since Elasticsearch 8.8. + */ + @Deprecated(since = "5.5") public boolean getForceSource() { return forceSource; } @@ -173,6 +177,10 @@ public SELF withBoundaryScannerLocale(String boundaryScannerLocale) { return (SELF) this; } + /** + * @deprecated the underlying functionality is deprecated since Elasticsearch 8.8. + */ + @Deprecated(since = "5.5") public SELF withForceSource(boolean forceSource) { this.forceSource = forceSource; return (SELF) this; diff --git a/src/main/kotlin/org/springframework/data/elasticsearch/core/SearchOperationsExtensions.kt b/src/main/kotlin/org/springframework/data/elasticsearch/core/SearchOperationsExtensions.kt index c8b67855c..4e3839d95 100644 --- a/src/main/kotlin/org/springframework/data/elasticsearch/core/SearchOperationsExtensions.kt +++ b/src/main/kotlin/org/springframework/data/elasticsearch/core/SearchOperationsExtensions.kt @@ -33,11 +33,11 @@ inline fun SearchOperations.searchOne(query: Query): SearchHit inline fun SearchOperations.searchOne(query: Query, index: IndexCoordinates): SearchHit? = searchOne(query, T::class.java, index) -inline fun SearchOperations.multiSearch(queries: List): List> = +inline fun SearchOperations.multiSearch(queries: List): List> = multiSearch(queries, T::class.java) inline fun SearchOperations.multiSearch( - queries: List, + queries: List, index: IndexCoordinates ): List> = multiSearch(queries, T::class.java, index) diff --git a/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java b/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java index 81aabf402..9d5a1f837 100644 --- a/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/client/elc/DevTests.java @@ -77,7 +77,7 @@ public class DevTests { private static final SimpleElasticsearchMappingContext mappingContext = new SimpleElasticsearchMappingContext(); private static final MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext); - private final TransportOptions transportOptions = new RestClientOptions(RequestOptions.DEFAULT).toBuilder() + private final TransportOptions transportOptions = new RestClientOptions(RequestOptions.DEFAULT, false).toBuilder() .addHeader("X-SpringDataElasticsearch-AlwaysThere", "true").setParameter("pretty", "true").build(); private final JsonpMapper jsonpMapper = new JacksonJsonpMapper();