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 bfd6f572a9e65..46ebef50d47d8 100644 --- a/server/src/main/java/org/elasticsearch/search/retriever/RetrieversFeatures.java +++ b/server/src/main/java/org/elasticsearch/search/retriever/RetrieversFeatures.java @@ -19,9 +19,15 @@ * 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() { return Set.of(); } + + @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 ac359bc4446f3..b724cd133f0c5 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 @@ -119,10 +119,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 d6883d3743a1d..4f913e28539ab 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 @@ -193,10 +193,6 @@ public String inferenceId() { return inferenceId; } - public int rankWindowSize() { - return rankWindowSize; - } - public boolean failuresAllowed() { return failuresAllowed; } 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 } diff --git a/x-pack/plugin/search-business-rules/src/main/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilder.java b/x-pack/plugin/search-business-rules/src/main/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilder.java index 2e7c18e6a85b9..60ac7019d6a90 100644 --- a/x-pack/plugin/search-business-rules/src/main/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilder.java +++ b/x-pack/plugin/search-business-rules/src/main/java/org/elasticsearch/xpack/searchbusinessrules/retriever/PinnedRetrieverBuilder.java @@ -151,10 +151,6 @@ public String getName() { return NAME; } - public int rankWindowSize() { - return rankWindowSize; - } - /** * Creates a PinnedQueryBuilder with the appropriate pinned documents. *