From f7eff0ff88520a527b651170f740b564a0e27329 Mon Sep 17 00:00:00 2001 From: Ioana Tagirta Date: Mon, 19 May 2025 18:40:34 +0200 Subject: [PATCH 1/2] Retrievers - Fix rank_window_size validation (#128108) (cherry picked from commit e9a8efe33ae3e11340d4f78d90c21e9dab4cd6a3) # Conflicts: # x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java # x-pack/plugin/search-business-rules/src/main/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilder.java --- .../retriever/CompoundRetrieverBuilder.java | 11 ++++++ .../search/retriever/RetrieversFeatures.java | 6 +++ .../retriever/QueryRuleRetrieverBuilder.java | 4 -- .../TextSimilarityRankRetrieverBuilder.java | 4 +- .../test/linear/10_linear_retriever.yml | 39 +++++++++++++++++++ 5 files changed, 58 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/search/retriever/CompoundRetrieverBuilder.java b/server/src/main/java/org/elasticsearch/search/retriever/CompoundRetrieverBuilder.java index 0bb5fd849bbcf..6cf0af0ef1541 100644 --- a/server/src/main/java/org/elasticsearch/search/retriever/CompoundRetrieverBuilder.java +++ b/server/src/main/java/org/elasticsearch/search/retriever/CompoundRetrieverBuilder.java @@ -247,6 +247,13 @@ public ActionRequestValidationException validate( if (isScroll) { validationException = addValidationError("cannot specify [" + getName() + "] and [scroll]", validationException); } + if (rankWindowSize < 0) { + validationException = addValidationError( + "[" + getRankWindowSizeField().getPreferredName() + "] parameter cannot be negative, found [" + rankWindowSize + "]", + validationException + ); + } + for (RetrieverSource innerRetriever : innerRetrievers) { validationException = innerRetriever.retriever().validate(source, validationException, isScroll, allowPartialSearchResults); if (innerRetriever.retriever() instanceof CompoundRetrieverBuilder compoundChild) { @@ -279,6 +286,10 @@ public int doHashCode() { return Objects.hash(innerRetrievers); } + public int rankWindowSize() { + return rankWindowSize; + } + protected final SearchSourceBuilder createSearchSourceBuilder(PointInTimeBuilder pit, RetrieverBuilder retrieverBuilder) { var sourceBuilder = new SearchSourceBuilder().pointInTimeBuilder(pit) .trackTotalHits(false) diff --git a/server/src/main/java/org/elasticsearch/search/retriever/RetrieversFeatures.java b/server/src/main/java/org/elasticsearch/search/retriever/RetrieversFeatures.java index 74a8b30c8e7dc..26c02af2fe4b5 100644 --- a/server/src/main/java/org/elasticsearch/search/retriever/RetrieversFeatures.java +++ b/server/src/main/java/org/elasticsearch/search/retriever/RetrieversFeatures.java @@ -19,6 +19,7 @@ * retrievers can be added individually with additional functionality. */ public class RetrieversFeatures implements FeatureSpecification { + public static final NodeFeature NEGATIVE_RANK_WINDOW_SIZE_FIX = new NodeFeature("retriever.negative_rank_window_size_fix"); @Override public Set getFeatures() { @@ -28,4 +29,9 @@ public Set getFeatures() { KnnRetrieverBuilder.KNN_RETRIEVER_SUPPORTED ); } + + @Override + public Set getTestFeatures() { + return Set.of(NEGATIVE_RANK_WINDOW_SIZE_FIX); + } } diff --git a/x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/retriever/QueryRuleRetrieverBuilder.java b/x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/retriever/QueryRuleRetrieverBuilder.java index 359066530f7d4..9eec14ecc0ec3 100644 --- a/x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/retriever/QueryRuleRetrieverBuilder.java +++ b/x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/retriever/QueryRuleRetrieverBuilder.java @@ -124,10 +124,6 @@ public String getName() { return NAME; } - public int rankWindowSize() { - return rankWindowSize; - } - @Override protected SearchSourceBuilder finalizeSourceBuilder(SearchSourceBuilder source) { checkValidSort(source.sorts()); diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java index d1fae17d9fea1..0018babeb82b3 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java @@ -195,8 +195,8 @@ public String inferenceId() { return inferenceId; } - public int rankWindowSize() { - return rankWindowSize; + public boolean failuresAllowed() { + return failuresAllowed; } @Override diff --git a/x-pack/plugin/rank-rrf/src/yamlRestTest/resources/rest-api-spec/test/linear/10_linear_retriever.yml b/x-pack/plugin/rank-rrf/src/yamlRestTest/resources/rest-api-spec/test/linear/10_linear_retriever.yml index 70db6c1543365..2d644a5746479 100644 --- a/x-pack/plugin/rank-rrf/src/yamlRestTest/resources/rest-api-spec/test/linear/10_linear_retriever.yml +++ b/x-pack/plugin/rank-rrf/src/yamlRestTest/resources/rest-api-spec/test/linear/10_linear_retriever.yml @@ -1063,3 +1063,42 @@ setup: - close_to: { hits.hits.0._score: { value: 10.5, error: 0.001 } } - match: { hits.hits.1._id: "1" } - match: { hits.hits.1._score: 10 } + +--- +"should throw when rank_window_size is negative": + - requires: + cluster_features: [ "retriever.negative_rank_window_size_fix" ] + reason: "Fix for negative rank_window_size error message" + - do: + catch: /\[rank_window_size\] parameter cannot be negative, found \[-10\]/ + search: + index: test + body: + retriever: + linear: + retrievers: [ + { + retriever: { + standard: { + query: { + match_all: { } + } + } + }, + weight: 10.0, + normalizer: "minmax" + }, + { + retriever: { + knn: { + field: "vector", + query_vector: [ 4 ], + k: 1, + num_candidates: 1 + } + }, + weight: 2.0 + } + ] + rank_window_size: -10 + - match: { status: 400 } From 6d3cc80d6d2e1ceb492ea3c74e6f3757d7897384 Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Mon, 19 May 2025 13:35:35 -0400 Subject: [PATCH 2/2] Fix build error --- .../textsimilarity/TextSimilarityRankRetrieverBuilder.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java index 0018babeb82b3..229e191bf6f58 100644 --- a/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java +++ b/x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java @@ -195,10 +195,6 @@ public String inferenceId() { return inferenceId; } - public boolean failuresAllowed() { - return failuresAllowed; - } - @Override protected void doToXContent(XContentBuilder builder, Params params) throws IOException { builder.field(RETRIEVER_FIELD.getPreferredName(), innerRetrievers.get(0).retriever());