@@ -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