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/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();
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