Skip to content

Commit 6c4fc59

Browse files
committed
Fix handling of page size and max results in search request preparation.
Original Pull Request #3106 Closes #3089 Signed-off-by: Peter-Josef Meisch <pj.meisch@sothawo.com> (cherry picked from commit 945179e)
1 parent 0e8401d commit 6c4fc59

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,11 +1287,15 @@ public MsearchRequest searchMsearchRequest(
12871287
.timeout(timeStringMs(query.getTimeout())) //
12881288
;
12891289

1290-
if (query.getPageable().isPaged()) {
1291-
bb //
1292-
.from((int) query.getPageable().getOffset()) //
1293-
.size(query.getPageable().getPageSize());
1294-
}
1290+
var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0;
1291+
var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize()
1292+
: INDEX_MAX_RESULT_WINDOW;
1293+
// if we have both a page size and a max results, we take the min, this is necessary for
1294+
// searchForStream to work correctly (#3098) as there the page size defines what is
1295+
// returned in a single request, and the max result determines the total number of
1296+
// documents returned
1297+
var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize;
1298+
bb.from((int) offset).size(size);
12951299

12961300
if (!isEmpty(query.getFields())) {
12971301
bb.fields(fb -> {
@@ -1304,10 +1308,6 @@ public MsearchRequest searchMsearchRequest(
13041308
bb.storedFields(query.getStoredFields());
13051309
}
13061310

1307-
if (query.isLimiting()) {
1308-
bb.size(query.getMaxResults());
1309-
}
1310-
13111311
if (query.getMinScore() > 0) {
13121312
bb.minScore((double) query.getMinScore());
13131313
}
@@ -1460,13 +1460,14 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14601460
builder.seqNoPrimaryTerm(true);
14611461
}
14621462

1463-
if (query.getPageable().isPaged()) {
1464-
builder //
1465-
.from((int) query.getPageable().getOffset()) //
1466-
.size(query.getPageable().getPageSize());
1467-
} else {
1468-
builder.from(0).size(INDEX_MAX_RESULT_WINDOW);
1469-
}
1463+
var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0;
1464+
var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize() : INDEX_MAX_RESULT_WINDOW;
1465+
// if we have both a page size and a max results, we take the min, this is necessary for
1466+
// searchForStream to work correctly (#3098) as there the page size defines what is
1467+
// returned in a single request, and the max result determines the total number of
1468+
// documents returned
1469+
var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize;
1470+
builder.from((int) offset).size(size);
14701471

14711472
if (!isEmpty(query.getFields())) {
14721473
var fieldAndFormats = query.getFields().stream().map(field -> FieldAndFormat.of(b -> b.field(field))).toList();
@@ -1481,10 +1482,6 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14811482
addIndicesOptions(builder, query.getIndicesOptions());
14821483
}
14831484

1484-
if (query.isLimiting()) {
1485-
builder.size(query.getMaxResults());
1486-
}
1487-
14881485
if (query.getMinScore() > 0) {
14891486
builder.minScore((double) query.getMinScore());
14901487
}

0 commit comments

Comments
 (0)