From 651bc39565442c45dee6639dc961e214dce9f4d3 Mon Sep 17 00:00:00 2001 From: Mike Pellegrini Date: Tue, 24 Jun 2025 19:25:24 -0400 Subject: [PATCH] Simplified Linear & RRF Retrievers - Return error on empty fields param (#129962) --- docs/changelog/129962.yaml | 5 +++++ .../rank/MultiFieldsInnerRetrieverUtils.java | 17 +++++++++++++---- .../rank/linear/LinearRetrieverBuilder.java | 4 ++-- .../xpack/rank/rrf/RRFRetrieverBuilder.java | 4 ++-- .../linear/20_linear_retriever_simplified.yml | 12 ++++++++++++ .../test/rrf/310_rrf_retriever_simplified.yml | 12 ++++++++++++ 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 docs/changelog/129962.yaml diff --git a/docs/changelog/129962.yaml b/docs/changelog/129962.yaml new file mode 100644 index 000000000000..dd06742a7479 --- /dev/null +++ b/docs/changelog/129962.yaml @@ -0,0 +1,5 @@ +pr: 129962 +summary: Simplified Linear & RRF Retrievers - Return error on empty fields param +area: Search +type: bug +issues: [] diff --git a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/MultiFieldsInnerRetrieverUtils.java b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/MultiFieldsInnerRetrieverUtils.java index 0715b4fa6754..8aa5dbf366a7 100644 --- a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/MultiFieldsInnerRetrieverUtils.java +++ b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/MultiFieldsInnerRetrieverUtils.java @@ -56,7 +56,7 @@ public class MultiFieldsInnerRetrieverUtils { */ public static ActionRequestValidationException validateParams( List innerRetrievers, - List fields, + @Nullable List fields, @Nullable String query, String retrieverName, String retrieversParamName, @@ -64,7 +64,7 @@ public class MultiFieldsInnerRetrieverUtils { String queryParamName, ActionRequestValidationException validationException ) { - if (fields.isEmpty() == false || query != null) { + if (fields != null || query != null) { // Using the multi-fields query format if (query == null) { // Return early here because the following validation checks assume a query param value is provided @@ -87,6 +87,13 @@ public class MultiFieldsInnerRetrieverUtils { ); } + if (fields != null && fields.isEmpty()) { + validationException = addValidationError( + String.format(Locale.ROOT, "[%s] [%s] cannot be empty", retrieverName, fieldsParamName), + validationException + ); + } + if (innerRetrievers.isEmpty() == false) { validationException = addValidationError( String.format(Locale.ROOT, "[%s] cannot combine [%s] and [%s]", retrieverName, retrieversParamName, queryParamName), @@ -131,13 +138,15 @@ public class MultiFieldsInnerRetrieverUtils { * @return The inner retriever tree as a {@code RetrieverBuilder} list */ public static List generateInnerRetrievers( - List fieldsAndWeights, + @Nullable List fieldsAndWeights, String query, Collection indicesMetadata, Function, CompoundRetrieverBuilder> innerNormalizerGenerator, @Nullable Consumer weightValidator ) { - Map parsedFieldsAndWeights = QueryParserHelper.parseFieldsAndWeights(fieldsAndWeights); + Map parsedFieldsAndWeights = fieldsAndWeights != null + ? QueryParserHelper.parseFieldsAndWeights(fieldsAndWeights) + : Map.of(); if (weightValidator != null) { parsedFieldsAndWeights.values().forEach(weightValidator); } diff --git a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/LinearRetrieverBuilder.java b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/LinearRetrieverBuilder.java index f0c36f9819af..c1a3f7d17448 100644 --- a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/LinearRetrieverBuilder.java +++ b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/LinearRetrieverBuilder.java @@ -163,7 +163,7 @@ public final class LinearRetrieverBuilder extends CompoundRetrieverBuilder() : new ArrayList<>(childRetrievers), rankWindowSize); - this.fields = fields == null ? List.of() : List.copyOf(fields); + this.fields = fields == null ? null : List.copyOf(fields); this.query = query; this.rankConstant = rankConstant; } @@ -293,7 +293,7 @@ public final class RRFRetrieverBuilder extends CompoundRetrieverBuilder