diff --git a/pom.xml b/pom.xml index ae19fa3cf..1eec82e2c 100644 --- a/pom.xml +++ b/pom.xml @@ -18,8 +18,10 @@ https://github.com/spring-projects/spring-data-elasticsearch - 7.17.2 - 7.17.2 + + 7.17.3 + + 7.17.3 2.17.1 4.1.65.Final 3.0.0-SNAPSHOT @@ -139,7 +141,7 @@ org.elasticsearch.client elasticsearch-rest-high-level-client - ${elasticsearch} + ${elasticsearch-rhlc} commons-logging @@ -163,7 +165,7 @@ org.elasticsearch.client elasticsearch-rest-client - ${elasticsearch} + ${elasticsearch-java} commons-logging diff --git a/src/main/asciidoc/preface.adoc b/src/main/asciidoc/preface.adoc index e713f544e..9fe6f8beb 100644 --- a/src/main/asciidoc/preface.adoc +++ b/src/main/asciidoc/preface.adoc @@ -34,7 +34,7 @@ The following table shows the Elasticsearch versions that are used by Spring Dat [cols="^,^,^,^,^",options="header"] |=== | Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework | Spring Boot -| 2022.0 (Raj) | 4.4.x | 7.17.2 | 5.3.x | 2.7.x +| 2022.0 (Raj) | 4.4.x | 7.17.3 | 5.3.x | 2.7.x | 2021.1 (Q) | 4.3.x | 7.15.2 | 5.3.x | 2.6.x | 2021.0 (Pascal) | 4.2.x | 7.12.0 | 5.3.x | 2.5.x | 2020.0 (Ockham)footnote:oom[Out of maintenance] | 4.1.xfootnote:oom[] | 7.9.3 | 5.3.2 | 2.4.x diff --git a/src/main/asciidoc/reference/elasticsearch-migration-guide-4.3-4.4.adoc b/src/main/asciidoc/reference/elasticsearch-migration-guide-4.3-4.4.adoc index bffc1c4fc..929961ac6 100644 --- a/src/main/asciidoc/reference/elasticsearch-migration-guide-4.3-4.4.adoc +++ b/src/main/asciidoc/reference/elasticsearch-migration-guide-4.3-4.4.adoc @@ -82,7 +82,7 @@ The dependencies for the new Elasticsearch client are still optional in Spring D co.elastic.clients elasticsearch-java - 7.17.2 + 7.17.3 commons-logging @@ -93,7 +93,7 @@ The dependencies for the new Elasticsearch client are still optional in Spring D org.elasticsearch.client elasticsearch-rest-client - 7.17.2 + 7.17.3 commons-logging diff --git a/src/main/asciidoc/reference/elasticsearch-new.adoc b/src/main/asciidoc/reference/elasticsearch-new.adoc index e03d693c7..11feabdcc 100644 --- a/src/main/asciidoc/reference/elasticsearch-new.adoc +++ b/src/main/asciidoc/reference/elasticsearch-new.adoc @@ -5,7 +5,7 @@ == New in Spring Data Elasticsearch 4.4 * Introduction of new imperative and reactive clients using the classes from the new Elasticsearch Java client -* Upgrade to Elasticsearch 7.17.2. +* Upgrade to Elasticsearch 7.17.3. [[new-features.4-3-0]] == New in Spring Data Elasticsearch 4.3 diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java index ca0f319aa..545c23aff 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ElasticsearchTemplate.java @@ -22,6 +22,7 @@ import co.elastic.clients.elasticsearch.core.*; import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem; import co.elastic.clients.elasticsearch.core.msearch.MultiSearchResponseItem; +import co.elastic.clients.elasticsearch.core.search.ResponseBody; import co.elastic.clients.json.JsonpMapper; import co.elastic.clients.transport.Version; @@ -353,8 +354,8 @@ protected SearchScrollHits searchScrollContinue(String scrollId, long scr return getSearchScrollHits(clazz, index, response); } - private > SearchScrollHits getSearchScrollHits(Class clazz, - IndexCoordinates index, R response) { + private SearchScrollHits getSearchScrollHits(Class clazz, IndexCoordinates index, + ResponseBody response) { ReadDocumentCallback documentCallback = new ReadDocumentCallback<>(elasticsearchConverter, clazz, index); SearchDocumentResponseCallback> callback = new ReadSearchScrollDocumentResponseCallback<>(clazz, index); @@ -446,7 +447,8 @@ private List> doMultiSearch(List multiS MultiSearchQueryParameter queryParameter = queryIterator.next(); MultiSearchResponseItem responseItem = responseIterator.next(); - // if responseItem kind is Result then responsItem.value is a MultiSearchItem which is derived from SearchResponse + // if responseItem kind is Result then responseItem.value is a MultiSearchItem which is derived from + // SearchResponse if (responseItem.isResult()) { 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 2be10341f..6b0782c0e 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 @@ -18,6 +18,7 @@ import co.elastic.clients.ApiClient; import co.elastic.clients.elasticsearch._types.ErrorResponse; import co.elastic.clients.elasticsearch.core.*; +import co.elastic.clients.elasticsearch.core.search.ResponseBody; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.JsonEndpoint; import co.elastic.clients.transport.TransportOptions; @@ -218,7 +219,7 @@ public Mono deleteByQuery( // endregion // region search - public Mono> search(SearchRequest request, Class tDocumentClass) { + public Mono> search(SearchRequest request, Class tDocumentClass) { Assert.notNull(request, "request must not be null"); Assert.notNull(tDocumentClass, "tDocumentClass must not be null"); @@ -227,7 +228,7 @@ public Mono> search(SearchRequest request, Class tDocum SearchRequest.createSearchEndpoint(this.getDeserializer(tDocumentClass)), transportOptions)); } - public Mono> search(Function> fn, + public Mono> search(Function> fn, Class tDocumentClass) { Assert.notNull(fn, "fn must not be null"); diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java index 4ddc4dfa3..f2587b023 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/ReactiveElasticsearchTemplate.java @@ -22,6 +22,7 @@ import co.elastic.clients.elasticsearch.core.*; import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem; import co.elastic.clients.elasticsearch.core.get.GetResult; +import co.elastic.clients.elasticsearch.core.search.ResponseBody; import co.elastic.clients.json.JsonpMapper; import co.elastic.clients.transport.Version; import reactor.core.publisher.Flux; @@ -326,22 +327,27 @@ private Flux doScroll(SearchRequest searchRequest) { Time scrollTimeout = searchRequest.scroll() != null ? searchRequest.scroll() : Time.of(t -> t.time("1m")); - Flux> searchResponses = Flux.usingWhen(Mono.fromSupplier(ScrollState::new), // - state -> Mono - .from(execute((ClientCallback>>) client -> client - .search(searchRequest, EntityAsMap.class))) // - .expand(entityAsMapSearchResponse -> { - - state.updateScrollId(entityAsMapSearchResponse.scrollId()); - - if (entityAsMapSearchResponse.hits() == null - || CollectionUtils.isEmpty(entityAsMapSearchResponse.hits().hits())) { - return Mono.empty(); - } - - return Mono.from(execute((ClientCallback>>) client -> client.scroll( - ScrollRequest.of(sr -> sr.scrollId(state.getScrollId()).scroll(scrollTimeout)), EntityAsMap.class))); - }), + Flux> searchResponses = Flux.usingWhen(Mono.fromSupplier(ScrollState::new), // + state -> { + return Mono + .from(execute((ClientCallback>>) client1 -> client1 + .search(searchRequest, EntityAsMap.class))) // + .expand(entityAsMapSearchResponse -> { + + state.updateScrollId(entityAsMapSearchResponse.scrollId()); + + if (entityAsMapSearchResponse.hits() == null + || CollectionUtils.isEmpty(entityAsMapSearchResponse.hits().hits())) { + return Mono.empty(); + } + + return Mono.from(execute((ClientCallback>>) client1 -> { + ScrollRequest scrollRequest = ScrollRequest + .of(sr -> sr.scrollId(state.getScrollId()).scroll(scrollTimeout)); + return client1.scroll(scrollRequest, EntityAsMap.class); + })); + }); + }, this::cleanupScroll, (state, ex) -> cleanupScroll(state), this::cleanupScroll); return searchResponses.flatMapIterable(entityAsMapSearchResponse -> entityAsMapSearchResponse.hits().hits()) @@ -363,7 +369,7 @@ protected Mono doCount(Query query, Class entityType, IndexCoordinates SearchRequest searchRequest = requestConverter.searchRequest(query, entityType, index, true, false); return Mono - .from(execute((ClientCallback>>) client -> client.search(searchRequest, + .from(execute((ClientCallback>>) client -> client.search(searchRequest, EntityAsMap.class))) .map(searchResponse -> searchResponse.hits().total() != null ? searchResponse.hits().total().value() : 0L); } @@ -371,7 +377,7 @@ protected Mono doCount(Query query, Class entityType, IndexCoordinates private Flux doFind(SearchRequest searchRequest) { return Mono - .from(execute((ClientCallback>>) client -> client.search(searchRequest, + .from(execute((ClientCallback>>) client -> client.search(searchRequest, EntityAsMap.class))) // .flatMapIterable(entityAsMapSearchResponse -> entityAsMapSearchResponse.hits().hits()) // .map(entityAsMapHit -> DocumentAdapters.from(entityAsMapHit, jsonpMapper)); @@ -391,7 +397,7 @@ protected Mono doFindForResponse(Query query, Class< .toFuture(); return Mono - .from(execute((ClientCallback>>) client -> client.search(searchRequest, + .from(execute((ClientCallback>>) client -> client.search(searchRequest, EntityAsMap.class))) .map(searchResponse -> SearchDocumentResponseBuilder.from(searchResponse, entityCreator, jsonpMapper)); } diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java index ab2b63739..0b0aa014f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/SearchDocumentResponseBuilder.java @@ -19,6 +19,7 @@ import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.elasticsearch.core.search.HitsMetadata; +import co.elastic.clients.elasticsearch.core.search.ResponseBody; import co.elastic.clients.elasticsearch.core.search.Suggestion; import co.elastic.clients.elasticsearch.core.search.TotalHits; import co.elastic.clients.json.JsonpMapper; @@ -45,21 +46,22 @@ class SearchDocumentResponseBuilder { /** * creates a SearchDocumentResponse from the {@link SearchResponse} * - * @param searchResponse the Elasticsearch search response + * @param responseBody the Elasticsearch response body * @param entityCreator function to create an entity from a {@link SearchDocument} * @param jsonpMapper to map JsonData objects * @return the SearchDocumentResponse */ - public static SearchDocumentResponse from(SearchResponse searchResponse, + @SuppressWarnings("DuplicatedCode") + public static SearchDocumentResponse from(ResponseBody responseBody, SearchDocumentResponse.EntityCreator entityCreator, JsonpMapper jsonpMapper) { - Assert.notNull(searchResponse, "searchResponse must not be null"); + Assert.notNull(responseBody, "responseBody must not be null"); Assert.notNull(entityCreator, "entityCreator must not be null"); - HitsMetadata hitsMetadata = searchResponse.hits(); - String scrollId = searchResponse.scrollId(); - Map aggregations = searchResponse.aggregations(); - Map>> suggest = searchResponse.suggest(); + HitsMetadata hitsMetadata = responseBody.hits(); + String scrollId = responseBody.scrollId(); + Map aggregations = responseBody.aggregations(); + Map>> suggest = responseBody.suggest(); return from(hitsMetadata, scrollId, aggregations, suggest, entityCreator, jsonpMapper); } 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 b28275186..b0c3e9819 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 @@ -25,7 +25,7 @@ import co.elastic.clients.elasticsearch.core.IndexRequest; import co.elastic.clients.elasticsearch.core.IndexResponse; import co.elastic.clients.elasticsearch.core.SearchRequest; -import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.ResponseBody; import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient; import co.elastic.clients.elasticsearch.indices.IndexSettings; import co.elastic.clients.transport.ElasticsearchTransport; @@ -300,7 +300,7 @@ void search() { .query(query -> query.match(matchQuery -> matchQuery.field("content").query(FieldValue.of("content1")))) .build(); - SearchResponse searchResponse = null; + ResponseBody searchResponse = null; try { searchResponse = searchImperative(searchRequest); assertThat(searchResponse).isNotNull(); @@ -316,11 +316,11 @@ void search() { } } - private SearchResponse searchImperative(SearchRequest searchRequest) throws IOException { + private ResponseBody searchImperative(SearchRequest searchRequest) throws IOException { return imperativeElasticsearchClient.search(searchRequest, EntityAsMap.class); } - private SearchResponse searchReactive(SearchRequest searchRequest) { + private ResponseBody searchReactive(SearchRequest searchRequest) { return Objects.requireNonNull(reactiveElasticsearchClient.search(searchRequest, EntityAsMap.class).block()); } // endregion diff --git a/src/test/resources/testcontainers-elasticsearch.properties b/src/test/resources/testcontainers-elasticsearch.properties index fc55f6131..94557e34b 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=7.17.2 +sde.testcontainers.image-version=7.17.3 # # # 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