From 945179e4eb6322ed8d2c77c7ce1188cbe0edcdb6 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Sat, 10 May 2025 21:21:17 +0200 Subject: [PATCH] Fix handling of page size and max results in search request preparation. Original Pull Request #3106 Closes #3089 Signed-off-by: Peter-Josef Meisch --- .../client/elc/RequestConverter.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) 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 ef0700b8..658b2cae 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 @@ -1295,11 +1295,15 @@ class RequestConverter extends AbstractQueryProcessor { .timeout(timeStringMs(query.getTimeout())) // ; - if (query.getPageable().isPaged()) { - bb // - .from((int) query.getPageable().getOffset()) // - .size(query.getPageable().getPageSize()); - } + var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0; + var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize() + : INDEX_MAX_RESULT_WINDOW; + // if we have both a page size and a max results, we take the min, this is necessary for + // searchForStream to work correctly (#3098) as there the page size defines what is + // returned in a single request, and the max result determines the total number of + // documents returned + var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize; + bb.from((int) offset).size(size); if (!isEmpty(query.getFields())) { bb.fields(fb -> { @@ -1312,10 +1316,6 @@ class RequestConverter extends AbstractQueryProcessor { bb.storedFields(query.getStoredFields()); } - if (query.isLimiting()) { - bb.size(query.getMaxResults()); - } - if (query.getMinScore() > 0) { bb.minScore((double) query.getMinScore()); } @@ -1473,13 +1473,14 @@ class RequestConverter extends AbstractQueryProcessor { builder.seqNoPrimaryTerm(true); } - if (query.getPageable().isPaged()) { - builder // - .from((int) query.getPageable().getOffset()) // - .size(query.getPageable().getPageSize()); - } else { - builder.from(0).size(INDEX_MAX_RESULT_WINDOW); - } + var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0; + var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize() : INDEX_MAX_RESULT_WINDOW; + // if we have both a page size and a max results, we take the min, this is necessary for + // searchForStream to work correctly (#3098) as there the page size defines what is + // returned in a single request, and the max result determines the total number of + // documents returned + var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize; + builder.from((int) offset).size(size); if (!isEmpty(query.getFields())) { var fieldAndFormats = query.getFields().stream().map(field -> FieldAndFormat.of(b -> b.field(field))).toList(); @@ -1494,10 +1495,6 @@ class RequestConverter extends AbstractQueryProcessor { addIndicesOptions(builder, query.getIndicesOptions()); } - if (query.isLimiting()) { - builder.size(query.getMaxResults()); - } - if (query.getMinScore() > 0) { builder.minScore((double) query.getMinScore()); }