Skip to content

Commit 5d6004f

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) (cherry picked from commit 6c4fc59)
1 parent 7138353 commit 5d6004f

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
@@ -1269,11 +1269,15 @@ public MsearchRequest searchMsearchRequest(
12691269
.timeout(timeStringMs(query.getTimeout())) //
12701270
;
12711271

1272-
if (query.getPageable().isPaged()) {
1273-
bb //
1274-
.from((int) query.getPageable().getOffset()) //
1275-
.size(query.getPageable().getPageSize());
1276-
}
1272+
var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0;
1273+
var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize()
1274+
: INDEX_MAX_RESULT_WINDOW;
1275+
// if we have both a page size and a max results, we take the min, this is necessary for
1276+
// searchForStream to work correctly (#3098) as there the page size defines what is
1277+
// returned in a single request, and the max result determines the total number of
1278+
// documents returned
1279+
var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize;
1280+
bb.from((int) offset).size(size);
12771281

12781282
if (!isEmpty(query.getFields())) {
12791283
bb.fields(fb -> {
@@ -1286,10 +1290,6 @@ public MsearchRequest searchMsearchRequest(
12861290
bb.storedFields(query.getStoredFields());
12871291
}
12881292

1289-
if (query.isLimiting()) {
1290-
bb.size(query.getMaxResults());
1291-
}
1292-
12931293
if (query.getMinScore() > 0) {
12941294
bb.minScore((double) query.getMinScore());
12951295
}
@@ -1443,13 +1443,14 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14431443
builder.seqNoPrimaryTerm(true);
14441444
}
14451445

1446-
if (query.getPageable().isPaged()) {
1447-
builder //
1448-
.from((int) query.getPageable().getOffset()) //
1449-
.size(query.getPageable().getPageSize());
1450-
} else {
1451-
builder.from(0).size(INDEX_MAX_RESULT_WINDOW);
1452-
}
1446+
var offset = query.getPageable().isPaged() ? query.getPageable().getOffset() : 0;
1447+
var pageSize = query.getPageable().isPaged() ? query.getPageable().getPageSize() : INDEX_MAX_RESULT_WINDOW;
1448+
// if we have both a page size and a max results, we take the min, this is necessary for
1449+
// searchForStream to work correctly (#3098) as there the page size defines what is
1450+
// returned in a single request, and the max result determines the total number of
1451+
// documents returned
1452+
var size = query.isLimiting() ? Math.min(pageSize, query.getMaxResults()) : pageSize;
1453+
builder.from((int) offset).size(size);
14531454

14541455
if (!isEmpty(query.getFields())) {
14551456
var fieldAndFormats = query.getFields().stream().map(field -> FieldAndFormat.of(b -> b.field(field))).toList();
@@ -1464,10 +1465,6 @@ private <T> void prepareSearchRequest(Query query, @Nullable String routing, @Nu
14641465
addIndicesOptions(builder, query.getIndicesOptions());
14651466
}
14661467

1467-
if (query.isLimiting()) {
1468-
builder.size(query.getMaxResults());
1469-
}
1470-
14711468
if (query.getMinScore() > 0) {
14721469
builder.minScore((double) query.getMinScore());
14731470
}

0 commit comments

Comments
 (0)