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 ef0700b8b..658b2caee 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 @@ public MsearchRequest searchMsearchRequest( .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 @@ public MsearchRequest searchMsearchRequest( bb.storedFields(query.getStoredFields()); } - if (query.isLimiting()) { - bb.size(query.getMaxResults()); - } - if (query.getMinScore() > 0) { bb.minScore((double) query.getMinScore()); } @@ -1473,13 +1473,14 @@ private void prepareSearchRequest(Query query, @Nullable String routing, @Nu 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 @@ private void prepareSearchRequest(Query query, @Nullable String routing, @Nu addIndicesOptions(builder, query.getIndicesOptions()); } - if (query.isLimiting()) { - builder.size(query.getMaxResults()); - } - if (query.getMinScore() > 0) { builder.minScore((double) query.getMinScore()); }