From 635bb9c8dcc7e684b1655e25e2f364504c8c0329 Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Wed, 5 Nov 2025 11:49:33 -0500 Subject: [PATCH 01/10] correct `from` in extractToSearchSourceBuilder --- .../retriever/RankDocsRetrieverBuilder.java | 7 +- .../xpack/rank/rrf/RRFRetrieverBuilderIT.java | 125 ++++++++++-------- 2 files changed, 77 insertions(+), 55 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java b/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java index 0cdd5ab35adcd..c73e1b5ac4100 100644 --- a/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java @@ -13,6 +13,7 @@ import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryRewriteContext; import org.elasticsearch.index.query.RankDocsQueryBuilder; +import org.elasticsearch.search.SearchService; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.rank.RankDoc; import org.elasticsearch.xcontent.XContentBuilder; @@ -135,8 +136,10 @@ public void extractToSearchSourceBuilder(SearchSourceBuilder searchSourceBuilder if (sourceHasMinScore()) { searchSourceBuilder.minScore(this.minScore == null ? Float.MIN_VALUE : this.minScore); } - if (searchSourceBuilder.size() + searchSourceBuilder.from() > rankDocResults.length) { - searchSourceBuilder.size(Math.max(0, rankDocResults.length - searchSourceBuilder.from())); + + int from = searchSourceBuilder.from() < 0 ? SearchService.DEFAULT_FROM : searchSourceBuilder.from(); + if (searchSourceBuilder.size() + from > rankDocResults.length) { + searchSourceBuilder.size(Math.max(0, rankDocResults.length - from)); } } diff --git a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java index 1a5cd6bca3059..2a72b68dbb101 100644 --- a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java +++ b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java @@ -161,63 +161,82 @@ public void testRRFPagination() { for (int i = 0; i < randomIntBetween(1, 5); i++) { int from = randomIntBetween(0, totalDocs - 1); int size = randomIntBetween(1, totalDocs - from); - for (int docs_to_fetch = from; docs_to_fetch < totalDocs; docs_to_fetch += size) { + for (int from_value = from; from_value < totalDocs; from_value += size) { SearchSourceBuilder source = new SearchSourceBuilder(); - source.from(docs_to_fetch); + source.from(from_value); source.size(size); - // this one retrieves docs 1, 2, 4, 6, and 7 - StandardRetrieverBuilder standard0 = new StandardRetrieverBuilder( - QueryBuilders.boolQuery() - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_1")).boost(10L)) - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_2")).boost(9L)) - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_4")).boost(8L)) - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_6")).boost(7L)) - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_7")).boost(6L)) - ); - // this one retrieves docs 2 and 6 due to prefilter - StandardRetrieverBuilder standard1 = new StandardRetrieverBuilder( - QueryBuilders.boolQuery() - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_2")).boost(20L)) - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_3")).boost(10L)) - .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_6")).boost(5L)) - ); - standard1.getPreFilterQueryBuilders().add(QueryBuilders.queryStringQuery("search").defaultField(TEXT_FIELD)); - // this one retrieves docs 2, 3, 6, and 7 - KnnRetrieverBuilder knnRetrieverBuilder = new KnnRetrieverBuilder( - VECTOR_FIELD, - new float[] { 2.0f }, - null, - 10, - 100, - null, - null, - null - ); - source.retriever( - new RRFRetrieverBuilder( - Arrays.asList( - new CompoundRetrieverBuilder.RetrieverSource(standard0, null), - new CompoundRetrieverBuilder.RetrieverSource(standard1, null), - new CompoundRetrieverBuilder.RetrieverSource(knnRetrieverBuilder, null) - ), - rankWindowSize, - rankConstant - ) - ); - SearchRequestBuilder req = client().prepareSearch(INDEX).setSource(source); - int fDocs_to_fetch = docs_to_fetch; - ElasticsearchAssertions.assertResponse(req, resp -> { - assertNull(resp.pointInTimeId()); - assertNotNull(resp.getHits().getTotalHits()); - assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); - assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); - assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(size)); - for (int k = 0; k < Math.min(size, resp.getHits().getHits().length); k++) { - assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + fDocs_to_fetch))); - } - }); + assertRRFPagination(source, from_value, size, rankWindowSize, rankConstant, expectedDocIds); } } + + // test with `from` as the default (-1) + int size = randomIntBetween(1, totalDocs); + for (int i = 0; i < randomIntBetween(1, 20); i++) { + SearchSourceBuilder source = new SearchSourceBuilder(); + source.size(size); + assertRRFPagination(source, 0, size, rankWindowSize, rankConstant, expectedDocIds); + } + } + + private void assertRRFPagination( + SearchSourceBuilder source, + int from, + int size, + int rankWindowSize, + int rankConstant, + List expectedDocIds + ) { + // this one retrieves docs 1, 2, 4, 6, and 7 + StandardRetrieverBuilder standard0 = new StandardRetrieverBuilder( + QueryBuilders.boolQuery() + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_1")).boost(10L)) + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_2")).boost(9L)) + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_4")).boost(8L)) + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_6")).boost(7L)) + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_7")).boost(6L)) + ); + // this one retrieves docs 2 and 6 due to prefilter + StandardRetrieverBuilder standard1 = new StandardRetrieverBuilder( + QueryBuilders.boolQuery() + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_2")).boost(20L)) + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_3")).boost(10L)) + .should(QueryBuilders.constantScoreQuery(QueryBuilders.idsQuery().addIds("doc_6")).boost(5L)) + ); + standard1.getPreFilterQueryBuilders().add(QueryBuilders.queryStringQuery("search").defaultField(TEXT_FIELD)); + // this one retrieves docs 2, 3, 6, and 7 + KnnRetrieverBuilder knnRetrieverBuilder = new KnnRetrieverBuilder( + VECTOR_FIELD, + new float[] { 2.0f }, + null, + 10, + 100, + null, + null, + null + ); + source.retriever( + new RRFRetrieverBuilder( + Arrays.asList( + new CompoundRetrieverBuilder.RetrieverSource(standard0, null), + new CompoundRetrieverBuilder.RetrieverSource(standard1, null), + new CompoundRetrieverBuilder.RetrieverSource(knnRetrieverBuilder, null) + ), + rankWindowSize, + rankConstant + ) + ); + SearchRequestBuilder req = client().prepareSearch(INDEX).setSource(source); + int innerFrom = from; + ElasticsearchAssertions.assertResponse(req, resp -> { + assertNull(resp.pointInTimeId()); + assertNotNull(resp.getHits().getTotalHits()); + assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); + assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); + assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(size)); + for (int k = 0; k < Math.min(size, resp.getHits().getHits().length); k++) { + assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); + } + }); } public void testRRFWithAggs() { From b39ba2f77734fdbfbef28dd9e308c71791b128e6 Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Wed, 5 Nov 2025 11:55:02 -0500 Subject: [PATCH 02/10] Update docs/changelog/137637.yaml --- docs/changelog/137637.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/137637.yaml diff --git a/docs/changelog/137637.yaml b/docs/changelog/137637.yaml new file mode 100644 index 0000000000000..e04d09320632f --- /dev/null +++ b/docs/changelog/137637.yaml @@ -0,0 +1,5 @@ +pr: 137637 +summary: Fix Bug in `RankDocRetrieverBuilder` when `from` is set to Default (-1) +area: Relevance +type: bug +issues: [] From 359ffdc1f6d2745bb84cbabad08671e6e9f9f793 Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Thu, 6 Nov 2025 09:29:48 -0500 Subject: [PATCH 03/10] fix tests; simplify from check --- .../search/retriever/RankDocsRetrieverBuilder.java | 9 ++++++--- .../test/inference/70_text_similarity_rank_retriever.yml | 8 +++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java b/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java index c73e1b5ac4100..12552457fa3b6 100644 --- a/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilder.java @@ -137,9 +137,12 @@ public void extractToSearchSourceBuilder(SearchSourceBuilder searchSourceBuilder searchSourceBuilder.minScore(this.minScore == null ? Float.MIN_VALUE : this.minScore); } - int from = searchSourceBuilder.from() < 0 ? SearchService.DEFAULT_FROM : searchSourceBuilder.from(); - if (searchSourceBuilder.size() + from > rankDocResults.length) { - searchSourceBuilder.size(Math.max(0, rankDocResults.length - from)); + if (searchSourceBuilder.from() < 0) { + searchSourceBuilder.from(SearchService.DEFAULT_FROM); + } + + if (searchSourceBuilder.size() + searchSourceBuilder.from() > rankDocResults.length) { + searchSourceBuilder.size(Math.max(0, rankDocResults.length - searchSourceBuilder.from())); } } diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml index 91ed1ebf92e72..d6fa0352c749f 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml @@ -1,3 +1,5 @@ +# CLI test runner command: +# ./gradlew ":x-pack:plugin:inference:yamlRestTest" --tests "org.elasticsearch.xpack.inference.InferenceRestIT.test {p0=inference/70_text_similarity_rank_retriever/*}" setup: - skip: features: @@ -398,7 +400,7 @@ setup: rank_window_size: 10 inference_id: my-rerank-model inference_text: "How often does the moon hide the sun?" - field: inference_text_field + field: topic size: 10 - match: { hits.total.value: 1 } @@ -477,7 +479,7 @@ setup: rank_window_size: 10 inference_id: my-rerank-model inference_text: "How often does the moon hide the sun?" - field: inference_text_field + field: topic min_score: 0 size: 10 @@ -925,7 +927,7 @@ setup: "Profile outputs information on chunk rescorer if selected": - requires: - test_runner_features: [contains] + test_runner_features: [ contains ] cluster_features: "text_similarity_rank_doc_explain_chunks" reason: rescore_chunks added explain support in 9.3.0 From b00fc529b28334367953dc84542d6d85584209df Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Thu, 6 Nov 2025 09:33:10 -0500 Subject: [PATCH 04/10] revert auto-formatting --- .../test/inference/70_text_similarity_rank_retriever.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml index d6fa0352c749f..cae117de81b79 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml @@ -927,7 +927,7 @@ setup: "Profile outputs information on chunk rescorer if selected": - requires: - test_runner_features: [ contains ] + test_runner_features: [contains] cluster_features: "text_similarity_rank_doc_explain_chunks" reason: rescore_chunks added explain support in 9.3.0 From 249105492673d2ccb8a1ccbb85d15d721aec20f9 Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Thu, 6 Nov 2025 13:23:07 -0500 Subject: [PATCH 05/10] fix failing test; additional tests; changelog area --- docs/changelog/137637.yaml | 2 +- .../RankDocsRetrieverBuilderTests.java | 4 +++ .../70_text_similarity_rank_retriever.yml | 2 +- .../xpack/rank/rrf/RRFRetrieverBuilderIT.java | 26 ++++++++++++++----- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/docs/changelog/137637.yaml b/docs/changelog/137637.yaml index e04d09320632f..88976ea28b5aa 100644 --- a/docs/changelog/137637.yaml +++ b/docs/changelog/137637.yaml @@ -1,5 +1,5 @@ pr: 137637 summary: Fix Bug in `RankDocRetrieverBuilder` when `from` is set to Default (-1) -area: Relevance +area: Search type: bug issues: [] diff --git a/server/src/test/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilderTests.java b/server/src/test/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilderTests.java index 772088296f76f..13428fb6ab7d9 100644 --- a/server/src/test/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilderTests.java @@ -15,6 +15,7 @@ import org.elasticsearch.index.query.RandomQueryBuilder; import org.elasticsearch.index.query.RankDocsQueryBuilder; import org.elasticsearch.index.query.Rewriteable; +import org.elasticsearch.search.SearchService; import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.rank.RankDoc; @@ -124,6 +125,9 @@ public void testExtractToSearchSourceBuilder() throws IOException { } } assertNull(source.postFilter()); + + // the default `from` is -1, when `extractToSearchSourceBuilder` is run, it should modify this to the default + assertEquals(SearchService.DEFAULT_FROM, source.from()); } public void testTopDocsQuery() throws IOException { diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml index cae117de81b79..25b4908bed2d0 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml @@ -479,7 +479,7 @@ setup: rank_window_size: 10 inference_id: my-rerank-model inference_text: "How often does the moon hide the sun?" - field: topic + field: text min_score: 0 size: 10 diff --git a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java index 2a72b68dbb101..76ad67068a33b 100644 --- a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java +++ b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java @@ -21,6 +21,7 @@ import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.rest.RestStatus; +import org.elasticsearch.search.SearchService; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.builder.SearchSourceBuilder; @@ -170,18 +171,23 @@ public void testRRFPagination() { } // test with `from` as the default (-1) - int size = randomIntBetween(1, totalDocs); - for (int i = 0; i < randomIntBetween(1, 20); i++) { + for (int i = 0; i < randomIntBetween(5, 20); i++) { + int size = randomIntBetween(1, totalDocs); SearchSourceBuilder source = new SearchSourceBuilder(); source.size(size); - assertRRFPagination(source, 0, size, rankWindowSize, rankConstant, expectedDocIds); + assertRRFPagination(source, source.from(), size, rankWindowSize, rankConstant, expectedDocIds); } + + // and finally test with from = default, and size > {total docs} to be sure + SearchSourceBuilder source = new SearchSourceBuilder(); + source.size(totalDocs + 2); + assertRRFPagination(source, source.from(), totalDocs, rankWindowSize, rankConstant, expectedDocIds); } private void assertRRFPagination( SearchSourceBuilder source, int from, - int size, + int expectedSize, int rankWindowSize, int rankConstant, List expectedDocIds @@ -226,16 +232,22 @@ private void assertRRFPagination( ) ); SearchRequestBuilder req = client().prepareSearch(INDEX).setSource(source); - int innerFrom = from; + int innerFrom = Math.max(from, 0); + int originalFrom = from; ElasticsearchAssertions.assertResponse(req, resp -> { assertNull(resp.pointInTimeId()); assertNotNull(resp.getHits().getTotalHits()); assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); - assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(size)); - for (int k = 0; k < Math.min(size, resp.getHits().getHits().length); k++) { + assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(expectedSize)); + for (int k = 0; k < Math.min(expectedSize, resp.getHits().getHits().length); k++) { assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); } + + if (originalFrom < 0) { + // assertThat(source.from(), equalTo(SearchService.DEFAULT_FROM)); + assertThat(resp.getHits().getHits().length, equalTo(expectedSize)); + } }); } From 29b1197f345159ca101a9b8fefdcf2c437d7d6b5 Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Thu, 6 Nov 2025 13:23:43 -0500 Subject: [PATCH 06/10] remove comment --- .../test/inference/70_text_similarity_rank_retriever.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml index 25b4908bed2d0..16c3e5a88539f 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml @@ -1,5 +1,3 @@ -# CLI test runner command: -# ./gradlew ":x-pack:plugin:inference:yamlRestTest" --tests "org.elasticsearch.xpack.inference.InferenceRestIT.test {p0=inference/70_text_similarity_rank_retriever/*}" setup: - skip: features: From d027200c317f7ea35e43c6bdb0ea3abbd10f8a35 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Thu, 6 Nov 2025 18:31:36 +0000 Subject: [PATCH 07/10] [CI] Auto commit changes from spotless --- .../org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java index 76ad67068a33b..947690b1b3a99 100644 --- a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java +++ b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java @@ -21,7 +21,6 @@ import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.rest.RestStatus; -import org.elasticsearch.search.SearchService; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.builder.SearchSourceBuilder; From 12420c4ad8420cb7653cdbc88bd29bcb92e8c9cb Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Thu, 6 Nov 2025 16:20:56 -0500 Subject: [PATCH 08/10] cleanup unit and YAML tests --- .../70_text_similarity_rank_retriever.yml | 2 +- .../xpack/rank/rrf/RRFRetrieverBuilderIT.java | 34 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml index 16c3e5a88539f..a3d779ab8f03f 100644 --- a/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml +++ b/x-pack/plugin/inference/src/yamlRestTest/resources/rest-api-spec/test/inference/70_text_similarity_rank_retriever.yml @@ -398,7 +398,7 @@ setup: rank_window_size: 10 inference_id: my-rerank-model inference_text: "How often does the moon hide the sun?" - field: topic + field: text size: 10 - match: { hits.total.value: 1 } diff --git a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java index 947690b1b3a99..6014c087070f7 100644 --- a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java +++ b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java @@ -186,7 +186,7 @@ public void testRRFPagination() { private void assertRRFPagination( SearchSourceBuilder source, int from, - int expectedSize, + int maxExpectedSize, int rankWindowSize, int rankConstant, List expectedDocIds @@ -231,23 +231,39 @@ private void assertRRFPagination( ) ); SearchRequestBuilder req = client().prepareSearch(INDEX).setSource(source); + int innerFrom = Math.max(from, 0); - int originalFrom = from; ElasticsearchAssertions.assertResponse(req, resp -> { assertNull(resp.pointInTimeId()); assertNotNull(resp.getHits().getTotalHits()); assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); - assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(expectedSize)); - for (int k = 0; k < Math.min(expectedSize, resp.getHits().getHits().length); k++) { - assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); - } - if (originalFrom < 0) { - // assertThat(source.from(), equalTo(SearchService.DEFAULT_FROM)); - assertThat(resp.getHits().getHits().length, equalTo(expectedSize)); + int expectedSize = innerFrom + maxExpectedSize > 6 ? 6 - innerFrom : maxExpectedSize; + assertThat(resp.getHits().getHits().length, equalTo(expectedSize)); + + for (int k = 0; k < expectedSize; k++) { + assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); } }); + +// int innerFrom = Math.max(from, 0); +// int originalFrom = from; +// ElasticsearchAssertions.assertResponse(req, resp -> { +// assertNull(resp.pointInTimeId()); +// assertNotNull(resp.getHits().getTotalHits()); +// assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); +// assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); +// assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(maxExpectedSize)); +// for (int k = 0; k < Math.min(maxExpectedSize, resp.getHits().getHits().length); k++) { +// assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); +// } +// +// if (originalFrom < 0) { +// // assertThat(source.from(), equalTo(SearchService.DEFAULT_FROM)); +// assertThat(resp.getHits().getHits().length, equalTo(maxExpectedSize)); +// } +// }); } public void testRRFWithAggs() { From bccb08a15e23bdcbf1806eacdee4f24fb09bd012 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Thu, 6 Nov 2025 21:29:09 +0000 Subject: [PATCH 09/10] [CI] Auto commit changes from spotless --- .../xpack/rank/rrf/RRFRetrieverBuilderIT.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java index 6014c087070f7..49fb15c7fc83f 100644 --- a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java +++ b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java @@ -52,7 +52,6 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.lessThanOrEqualTo; @ESIntegTestCase.ClusterScope(minNumDataNodes = 3) public class RRFRetrieverBuilderIT extends ESIntegTestCase { @@ -247,23 +246,23 @@ private void assertRRFPagination( } }); -// int innerFrom = Math.max(from, 0); -// int originalFrom = from; -// ElasticsearchAssertions.assertResponse(req, resp -> { -// assertNull(resp.pointInTimeId()); -// assertNotNull(resp.getHits().getTotalHits()); -// assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); -// assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); -// assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(maxExpectedSize)); -// for (int k = 0; k < Math.min(maxExpectedSize, resp.getHits().getHits().length); k++) { -// assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); -// } -// -// if (originalFrom < 0) { -// // assertThat(source.from(), equalTo(SearchService.DEFAULT_FROM)); -// assertThat(resp.getHits().getHits().length, equalTo(maxExpectedSize)); -// } -// }); + // int innerFrom = Math.max(from, 0); + // int originalFrom = from; + // ElasticsearchAssertions.assertResponse(req, resp -> { + // assertNull(resp.pointInTimeId()); + // assertNotNull(resp.getHits().getTotalHits()); + // assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); + // assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); + // assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(maxExpectedSize)); + // for (int k = 0; k < Math.min(maxExpectedSize, resp.getHits().getHits().length); k++) { + // assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); + // } + // + // if (originalFrom < 0) { + // // assertThat(source.from(), equalTo(SearchService.DEFAULT_FROM)); + // assertThat(resp.getHits().getHits().length, equalTo(maxExpectedSize)); + // } + // }); } public void testRRFWithAggs() { From e5ac4f4bc5b5c8a2290ec67b45304e772c6106ba Mon Sep 17 00:00:00 2001 From: "Mark J. Hoy" Date: Thu, 6 Nov 2025 17:45:32 -0500 Subject: [PATCH 10/10] remove old, commented code --- .../xpack/rank/rrf/RRFRetrieverBuilderIT.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java index 49fb15c7fc83f..7e86f3d7a4b11 100644 --- a/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java +++ b/x-pack/plugin/rank-rrf/src/internalClusterTest/java/org/elasticsearch/xpack/rank/rrf/RRFRetrieverBuilderIT.java @@ -245,24 +245,6 @@ private void assertRRFPagination( assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); } }); - - // int innerFrom = Math.max(from, 0); - // int originalFrom = from; - // ElasticsearchAssertions.assertResponse(req, resp -> { - // assertNull(resp.pointInTimeId()); - // assertNotNull(resp.getHits().getTotalHits()); - // assertThat(resp.getHits().getTotalHits().value(), equalTo(6L)); - // assertThat(resp.getHits().getTotalHits().relation(), equalTo(TotalHits.Relation.EQUAL_TO)); - // assertThat(resp.getHits().getHits().length, lessThanOrEqualTo(maxExpectedSize)); - // for (int k = 0; k < Math.min(maxExpectedSize, resp.getHits().getHits().length); k++) { - // assertThat(resp.getHits().getAt(k).getId(), equalTo(expectedDocIds.get(k + innerFrom))); - // } - // - // if (originalFrom < 0) { - // // assertThat(source.from(), equalTo(SearchService.DEFAULT_FROM)); - // assertThat(resp.getHits().getHits().length, equalTo(maxExpectedSize)); - // } - // }); } public void testRRFWithAggs() {