@@ -24,17 +24,20 @@ public class LinearRetrieverComponent implements ToXContentObject {
2424
2525 public static final ParseField RETRIEVER_FIELD = new ParseField ("retriever" );
2626 public static final ParseField WEIGHT_FIELD = new ParseField ("weight" );
27- public static final ScoreNormalizer DEFAULT_NORMALIZER = IdentityScoreNormalizer . INSTANCE ;
28-
27+ public static final ParseField NORMALIZER_FIELD = new ParseField ( "normalizer" ) ;
28+
2929 static final float DEFAULT_WEIGHT = 1f ;
30+ static final ScoreNormalizer DEFAULT_NORMALIZER = IdentityScoreNormalizer .INSTANCE ;
3031
3132 RetrieverBuilder retriever ;
3233 float weight ;
34+ ScoreNormalizer normalizer ;
3335
34- public LinearRetrieverComponent (RetrieverBuilder retrieverBuilder , Float weight ) {
36+ public LinearRetrieverComponent (RetrieverBuilder retrieverBuilder , Float weight , ScoreNormalizer normalizer ) {
3537 assert retrieverBuilder != null ;
3638 this .retriever = retrieverBuilder ;
3739 this .weight = weight == null ? DEFAULT_WEIGHT : weight ;
40+ this .normalizer = normalizer == null ? DEFAULT_NORMALIZER : normalizer ;
3841 if (this .weight < 0 ) {
3942 throw new IllegalArgumentException ("[weight] must be non-negative" );
4043 }
@@ -44,6 +47,9 @@ public LinearRetrieverComponent(RetrieverBuilder retrieverBuilder, Float weight)
4447 public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
4548 builder .field (RETRIEVER_FIELD .getPreferredName (), retriever );
4649 builder .field (WEIGHT_FIELD .getPreferredName (), weight );
50+ if (normalizer != null && !normalizer .equals (DEFAULT_NORMALIZER )) {
51+ builder .field (NORMALIZER_FIELD .getPreferredName (), normalizer .getName ());
52+ }
4753 return builder ;
4854 }
4955
@@ -54,7 +60,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
5460 args -> {
5561 RetrieverBuilder retrieverBuilder = (RetrieverBuilder ) args [0 ];
5662 Float weight = (Float ) args [1 ];
57- return new LinearRetrieverComponent (retrieverBuilder , weight );
63+ ScoreNormalizer normalizer = (ScoreNormalizer ) args [2 ];
64+ return new LinearRetrieverComponent (retrieverBuilder , weight , normalizer );
5865 }
5966 );
6067
@@ -65,6 +72,12 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
6572 return innerRetriever ;
6673 }, RETRIEVER_FIELD );
6774 PARSER .declareFloat (optionalConstructorArg (), WEIGHT_FIELD );
75+ PARSER .declareField (
76+ optionalConstructorArg (),
77+ (p , c ) -> ScoreNormalizer .valueOf (p .text ()),
78+ NORMALIZER_FIELD ,
79+ ObjectParser .ValueType .STRING
80+ );
6881 }
6982
7083 public static LinearRetrieverComponent fromXContent (XContentParser parser , RetrieverParserContext context ) throws IOException {
0 commit comments