diff --git a/docs/changelog/129181.yaml b/docs/changelog/129181.yaml new file mode 100644 index 000000000000..b19c2c8c32c3 --- /dev/null +++ b/docs/changelog/129181.yaml @@ -0,0 +1,5 @@ +pr: 129181 +summary: Add Cluster Feature for L2 Norm +area: "Search" +type: bug +issues: [] diff --git a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/RankRRFFeatures.java b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/RankRRFFeatures.java index 5119c4ee3e7e..053013064b31 100644 --- a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/RankRRFFeatures.java +++ b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/RankRRFFeatures.java @@ -13,6 +13,7 @@ import org.elasticsearch.features.NodeFeature; import java.util.Set; import static org.elasticsearch.search.retriever.CompoundRetrieverBuilder.INNER_RETRIEVERS_FILTER_SUPPORT; +import static org.elasticsearch.xpack.rank.linear.L2ScoreNormalizer.LINEAR_RETRIEVER_L2_NORM; import static org.elasticsearch.xpack.rank.linear.MinMaxScoreNormalizer.LINEAR_RETRIEVER_MINMAX_SINGLE_DOC_FIX; public class RankRRFFeatures implements FeatureSpecification { @@ -26,6 +27,6 @@ public class RankRRFFeatures implements FeatureSpecification { @Override public Set getTestFeatures() { - return Set.of(INNER_RETRIEVERS_FILTER_SUPPORT, LINEAR_RETRIEVER_MINMAX_SINGLE_DOC_FIX); + return Set.of(INNER_RETRIEVERS_FILTER_SUPPORT, LINEAR_RETRIEVER_MINMAX_SINGLE_DOC_FIX, LINEAR_RETRIEVER_L2_NORM); } } diff --git a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/L2ScoreNormalizer.java b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/L2ScoreNormalizer.java index c05cdfe7cf8f..34c0a48f15a0 100644 --- a/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/L2ScoreNormalizer.java +++ b/x-pack/plugin/rank-rrf/src/main/java/org/elasticsearch/xpack/rank/linear/L2ScoreNormalizer.java @@ -9,6 +9,7 @@ package org.elasticsearch.xpack.rank.linear; import org.apache.lucene.search.ScoreDoc; +import org.elasticsearch.features.NodeFeature; /** * A score normalizer that applies L2 normalization to a set of scores. @@ -25,6 +26,8 @@ public class L2ScoreNormalizer extends ScoreNormalizer { private static final float EPSILON = 1e-6f; + public static final NodeFeature LINEAR_RETRIEVER_L2_NORM = new NodeFeature("linear_retriever.l2_norm"); + public L2ScoreNormalizer() {} @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 61c8c82fb604..3c672ee70978 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 @@ -266,6 +266,9 @@ setup: --- "should normalize initial scores with l2_norm": + - requires: + cluster_features: [ "linear_retriever.l2_norm" ] + reason: "Requires l2_norm normalization support in linear retriever" - do: search: index: test @@ -319,6 +322,9 @@ setup: --- "should handle all zero scores in normalization": + - requires: + cluster_features: [ "linear_retriever.l2_norm" ] + reason: "Requires l2_norm normalization support in linear retriever" - do: search: index: test