Skip to content

Commit 945179e

Browse files
authored
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>
1 parent ea38ef1 commit 945179e

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
@@ -1295,11 +1295,15 @@ public MsearchRequest searchMsearchRequest(
12951295
.timeout(timeStringMs(query.getTimeout())) //
12961296
;
12971297

1298-
if (query.getPageable().isPaged()) {
1299-
bb //
1300-
.from((int) query.getPageable().getOffset()) //
1301-
.size(query.getPageable().getPageSize());
1302-
}
1298+
var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0;
1299+
var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize()
1300+
: INDEX_MAX_RESULT_WINDOW;
1301+
// if we have both a page size and a max results, we take the min, this is necessary for
1302+
// searchForStream to work correctly (#3098) as there the page size defines what is
1303+
// returned in a single request, and the max result determines the total number of
1304+
// documents returned
1305+
var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize;
1306+
bb.from((int) offset).size(size);
13031307

13041308
if (!isEmpty(query.getFields())) {
13051309
bb.fields(fb -> {
@@ -1312,10 +1316,6 @@ public MsearchRequest searchMsearchRequest(
13121316
bb.storedFields(query.getStoredFields());
13131317
}
13141318

1315-
if (query.isLimiting()) {
1316-
bb.size(query.getMaxResults());
1317-
}
1318-
13191319
if (query.getMinScore() > 0) {
13201320
bb.minScore((double) query.getMinScore());
13211321
}
@@ -1473,13 +1473,14 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14731473
builder.seqNoPrimaryTerm(true);
14741474
}
14751475

1476-
if (query.getPageable().isPaged()) {
1477-
builder //
1478-
.from((int) query.getPageable().getOffset()) //
1479-
.size(query.getPageable().getPageSize());
1480-
} else {
1481-
builder.from(0).size(INDEX_MAX_RESULT_WINDOW);
1482-
}
1476+
var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0;
1477+
var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize() : INDEX_MAX_RESULT_WINDOW;
1478+
// if we have both a page size and a max results, we take the min, this is necessary for
1479+
// searchForStream to work correctly (#3098) as there the page size defines what is
1480+
// returned in a single request, and the max result determines the total number of
1481+
// documents returned
1482+
var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize;
1483+
builder.from((int) offset).size(size);
14831484

14841485
if (!isEmpty(query.getFields())) {
14851486
var fieldAndFormats = query.getFields().stream().map(field -> FieldAndFormat.of(b -> b.field(field))).toList();
@@ -1494,10 +1495,6 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14941495
addIndicesOptions(builder, query.getIndicesOptions());
14951496
}
14961497

1497-
if (query.isLimiting()) {
1498-
builder.size(query.getMaxResults());
1499-
}
1500-
15011498
if (query.getMinScore() > 0) {
15021499
builder.minScore((double) query.getMinScore());
15031500
}

0 commit comments

Comments
 (0)