Upgrade to Elasticsearch 8.16.1.

Original Pull Request #3019
Closes #3017
This commit is contained in:
Peter-Josef Meisch 2024-12-01 13:49:43 +01:00 committed by GitHub
parent 028239fbdb
commit 5f297f1dc3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 57 additions and 28 deletions

View File

@ -21,7 +21,7 @@
<springdata.commons>3.5.0-SNAPSHOT</springdata.commons> <springdata.commons>3.5.0-SNAPSHOT</springdata.commons>
<!-- version of the ElasticsearchClient --> <!-- version of the ElasticsearchClient -->
<elasticsearch-java>8.15.3</elasticsearch-java> <elasticsearch-java>8.16.1</elasticsearch-java>
<hoverfly>0.19.0</hoverfly> <hoverfly>0.19.0</hoverfly>
<log4j>2.23.1</log4j> <log4j>2.23.1</log4j>

View File

@ -1,6 +1,10 @@
[[new-features]] [[new-features]]
= What's new = 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-features.5-4-0]]
== New in Spring Data Elasticsearch 5.4 == New in Spring Data Elasticsearch 5.4

View File

@ -6,8 +6,8 @@ The following table shows the Elasticsearch and Spring versions that are used by
[cols="^,^,^,^",options="header"] [cols="^,^,^,^",options="header"]
|=== |===
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework | Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework
| 2025.0 (in development) | 5.5.x | 8.15.3 | 6.2.x | 2025.0 (in development) | 5.5.x | 8.16.1 | 6.2.x
| 2024.1 | 5.4.x | 8.15.3 | 6.1.x | 2024.1 | 5.4.x | 8.15.5 | 6.1.x
| 2024.0 | 5.3.x | 8.13.4 | 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.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 | 2023.0 (Ullmann) | 5.1.xfootnote:oom[] | 8.7.1 | 6.0.x

View File

@ -18,6 +18,8 @@ package org.springframework.data.elasticsearch.client.elc;
import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.ElasticsearchTransport;
import java.io.IOException;
import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClient;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -36,7 +38,10 @@ public class AutoCloseableElasticsearchClient extends ElasticsearchClient implem
} }
@Override @Override
public void close() throws Exception { public void close() throws IOException {
transport.close(); // 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();
} }
} }

View File

@ -329,7 +329,7 @@ public final class ElasticsearchClients {
Assert.notNull(jsonpMapper, "jsonpMapper must not be null"); Assert.notNull(jsonpMapper, "jsonpMapper must not be null");
TransportOptions.Builder transportOptionsBuilder = transportOptions != null ? transportOptions.toBuilder() TransportOptions.Builder transportOptionsBuilder = transportOptions != null ? transportOptions.toBuilder()
: new RestClientOptions(RequestOptions.DEFAULT).toBuilder(); : new RestClientOptions(RequestOptions.DEFAULT, false).toBuilder();
RestClientOptions.Builder restClientOptionsBuilder = getRestClientOptionsBuilder(transportOptions); RestClientOptions.Builder restClientOptionsBuilder = getRestClientOptionsBuilder(transportOptions);

View File

@ -135,6 +135,6 @@ public abstract class ElasticsearchConfiguration extends ElasticsearchConfigurat
* @return the options that should be added to every request. Must not be {@literal null} * @return the options that should be added to every request. Must not be {@literal null}
*/ */
public TransportOptions transportOptions() { public TransportOptions transportOptions() {
return new RestClientOptions(RequestOptions.DEFAULT); return new RestClientOptions(RequestOptions.DEFAULT, false);
} }
} }

View File

@ -27,6 +27,7 @@ import co.elastic.clients.transport.endpoints.EndpointWithResponseMapperAttr;
import co.elastic.clients.util.ObjectBuilder; import co.elastic.clients.util.ObjectBuilder;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.io.IOException;
import java.util.function.Function; import java.util.function.Function;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
@ -56,8 +57,11 @@ public class ReactiveElasticsearchClient extends ApiClient<ElasticsearchTranspor
} }
@Override @Override
public void close() throws Exception { public void close() throws IOException {
transport.close(); // 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 // region child clients
@ -127,7 +131,8 @@ public class ReactiveElasticsearchClient extends ApiClient<ElasticsearchTranspor
// java.lang.Class<TDocument>) // java.lang.Class<TDocument>)
// noinspection unchecked // noinspection unchecked
JsonEndpoint<GetRequest, GetResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<GetRequest, GetResponse<T>, ErrorResponse>) GetRequest._ENDPOINT; JsonEndpoint<GetRequest, GetResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<GetRequest, GetResponse<T>, 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)); getDeserializer(tClass));
return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions)); return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions));
@ -172,7 +177,8 @@ public class ReactiveElasticsearchClient extends ApiClient<ElasticsearchTranspor
// noinspection unchecked // noinspection unchecked
JsonEndpoint<MgetRequest, MgetResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<MgetRequest, MgetResponse<T>, ErrorResponse>) MgetRequest._ENDPOINT; JsonEndpoint<MgetRequest, MgetResponse<T>, ErrorResponse> endpoint = (JsonEndpoint<MgetRequest, MgetResponse<T>, 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)); this.getDeserializer(clazz));
return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions)); return Mono.fromFuture(transport.performRequestAsync(request, endpoint, transportOptions));

View File

@ -125,6 +125,6 @@ public abstract class ReactiveElasticsearchConfiguration extends ElasticsearchCo
* @return the options that should be added to every request. Must not be {@literal null} * @return the options that should be added to every request. Must not be {@literal null}
*/ */
public TransportOptions transportOptions() { public TransportOptions transportOptions() {
return new RestClientOptions(RequestOptions.DEFAULT).toBuilder().build(); return new RestClientOptions(RequestOptions.DEFAULT, false).toBuilder().build();
} }
} }

View File

@ -51,6 +51,7 @@ import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.elasticsearch.indices.ExistsIndexTemplateRequest; import co.elastic.clients.elasticsearch.indices.ExistsIndexTemplateRequest;
import co.elastic.clients.elasticsearch.indices.ExistsRequest; import co.elastic.clients.elasticsearch.indices.ExistsRequest;
import co.elastic.clients.elasticsearch.indices.update_aliases.Action; 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.JsonData;
import co.elastic.clients.json.JsonpDeserializer; import co.elastic.clients.json.JsonpDeserializer;
import co.elastic.clients.json.JsonpMapper; import co.elastic.clients.json.JsonpMapper;
@ -533,17 +534,22 @@ class RequestConverter extends AbstractQueryProcessor {
public co.elastic.clients.elasticsearch.sql.QueryRequest sqlQueryRequest(SqlQuery query) { public co.elastic.clients.elasticsearch.sql.QueryRequest sqlQueryRequest(SqlQuery query) {
Assert.notNull(query, "Query must not be null."); Assert.notNull(query, "Query must not be null.");
return co.elastic.clients.elasticsearch.sql.QueryRequest.of(sqb -> { return co.elastic.clients.elasticsearch.sql.QueryRequest.of(sqb -> sqb
sqb.query(query.getQuery()).catalog(query.getCatalog()).columnar(query.getColumnar()).cursor(query.getCursor()) .query(query.getQuery())
.fetchSize(query.getFetchSize()).fieldMultiValueLeniency(query.getFieldMultiValueLeniency()) .catalog(query.getCatalog())
.indexUsingFrozen(query.getIndexIncludeFrozen()).keepAlive(time(query.getKeepAlive())) .columnar(query.getColumnar())
.keepOnCompletion(query.getKeepOnCompletion()).pageTimeout(time(query.getPageTimeout())) .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())) .requestTimeout(time(query.getRequestTimeout()))
.waitForCompletionTimeout(time(query.getWaitForCompletionTimeout())).filter(getQuery(query.getFilter(), null)) .waitForCompletionTimeout(time(query.getWaitForCompletionTimeout()))
.timeZone(Objects.toString(query.getTimeZone(), null)).format("json"); .filter(getQuery(query.getFilter(), null))
.timeZone(Objects.toString(query.getTimeZone(), null))
return sqb; .format(SqlFormat.Json));
});
} }
// endregion // endregion

View File

@ -80,6 +80,10 @@ public abstract class HighlightCommonParameters {
return boundaryScannerLocale; return boundaryScannerLocale;
} }
/**
* @deprecated the underlying functionality is deprecated since Elasticsearch 8.8.
*/
@Deprecated(since = "5.5")
public boolean getForceSource() { public boolean getForceSource() {
return forceSource; return forceSource;
} }
@ -173,6 +177,10 @@ public abstract class HighlightCommonParameters {
return (SELF) this; return (SELF) this;
} }
/**
* @deprecated the underlying functionality is deprecated since Elasticsearch 8.8.
*/
@Deprecated(since = "5.5")
public SELF withForceSource(boolean forceSource) { public SELF withForceSource(boolean forceSource) {
this.forceSource = forceSource; this.forceSource = forceSource;
return (SELF) this; return (SELF) this;

View File

@ -33,11 +33,11 @@ inline fun <reified T : Any> SearchOperations.searchOne(query: Query): SearchHit
inline fun <reified T : Any> SearchOperations.searchOne(query: Query, index: IndexCoordinates): SearchHit<T>? = inline fun <reified T : Any> SearchOperations.searchOne(query: Query, index: IndexCoordinates): SearchHit<T>? =
searchOne(query, T::class.java, index) searchOne(query, T::class.java, index)
inline fun <reified T : Any> SearchOperations.multiSearch(queries: List<out Query>): List<SearchHits<T>> = inline fun <reified T : Any> SearchOperations.multiSearch(queries: List<Query>): List<SearchHits<T>> =
multiSearch(queries, T::class.java) multiSearch(queries, T::class.java)
inline fun <reified T : Any> SearchOperations.multiSearch( inline fun <reified T : Any> SearchOperations.multiSearch(
queries: List<out Query>, queries: List<Query>,
index: IndexCoordinates index: IndexCoordinates
): List<SearchHits<T>> = ): List<SearchHits<T>> =
multiSearch(queries, T::class.java, index) multiSearch(queries, T::class.java, index)

View File

@ -77,7 +77,7 @@ public class DevTests {
private static final SimpleElasticsearchMappingContext mappingContext = new SimpleElasticsearchMappingContext(); private static final SimpleElasticsearchMappingContext mappingContext = new SimpleElasticsearchMappingContext();
private static final MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext); 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(); .addHeader("X-SpringDataElasticsearch-AlwaysThere", "true").setParameter("pretty", "true").build();
private final JsonpMapper jsonpMapper = new JacksonJsonpMapper(); private final JsonpMapper jsonpMapper = new JacksonJsonpMapper();

View File

@ -15,7 +15,7 @@
# #
# #
sde.testcontainers.image-name=docker.elastic.co/elasticsearch/elasticsearch 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 # 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