3131import java .util .List ;
3232import java .util .Map ;
3333
34- import static org .elasticsearch .index .query .RankDocsQueryBuilder .DEFAULT_MIN_SCORE ;
35- import static org .elasticsearch .search .retriever .CompoundRetrieverBuilder .RANK_WINDOW_SIZE_FIELD ;
3634import static org .elasticsearch .xcontent .ConstructingObjectParser .constructorArg ;
3735import static org .elasticsearch .xcontent .ConstructingObjectParser .optionalConstructorArg ;
3836import static org .elasticsearch .xpack .rank .RankRRFFeatures .LINEAR_RETRIEVER_SUPPORTED ;
@@ -56,7 +54,6 @@ public final class LinearRetrieverBuilder extends CompoundRetrieverBuilder<Linea
5654
5755 private final float [] weights ;
5856 private final ScoreNormalizer [] normalizers ;
59- private float minScore ;
6057
6158 @ SuppressWarnings ("unchecked" )
6259 static final ConstructingObjectParser <LinearRetrieverBuilder , RetrieverParserContext > PARSER = new ConstructingObjectParser <>(
@@ -75,7 +72,7 @@ public final class LinearRetrieverBuilder extends CompoundRetrieverBuilder<Linea
7572 normalizers [index ] = component .normalizer ;
7673 index ++;
7774 }
78- return new LinearRetrieverBuilder (innerRetrievers , rankWindowSize , weights , normalizers , DEFAULT_MIN_SCORE );
75+ return new LinearRetrieverBuilder (innerRetrievers , rankWindowSize , weights , normalizers );
7976 }
8077 );
8178
@@ -108,21 +105,14 @@ public static LinearRetrieverBuilder fromXContent(XContentParser parser, Retriev
108105 }
109106
110107 LinearRetrieverBuilder (List <RetrieverSource > innerRetrievers , int rankWindowSize ) {
111- this (
112- innerRetrievers ,
113- rankWindowSize ,
114- getDefaultWeight (innerRetrievers .size ()),
115- getDefaultNormalizers (innerRetrievers .size ()),
116- DEFAULT_MIN_SCORE
117- );
108+ this (innerRetrievers , rankWindowSize , getDefaultWeight (innerRetrievers .size ()), getDefaultNormalizers (innerRetrievers .size ()));
118109 }
119110
120111 public LinearRetrieverBuilder (
121112 List <RetrieverSource > innerRetrievers ,
122113 int rankWindowSize ,
123114 float [] weights ,
124- ScoreNormalizer [] normalizers ,
125- float minScore
115+ ScoreNormalizer [] normalizers
126116 ) {
127117 super (innerRetrievers , rankWindowSize );
128118 if (weights .length != innerRetrievers .size ()) {
@@ -131,17 +121,13 @@ public LinearRetrieverBuilder(
131121 if (normalizers .length != innerRetrievers .size ()) {
132122 throw new IllegalArgumentException ("The number of normalizers must match the number of inner retrievers" );
133123 }
134- if (minScore < 0 ) {
135- throw new IllegalArgumentException ("[min_score] must be greater than 0, was: " + minScore );
136- }
137124 this .weights = weights ;
138125 this .normalizers = normalizers ;
139- this .minScore = minScore ;
140126 }
141127
142128 @ Override
143129 protected LinearRetrieverBuilder clone (List <RetrieverSource > newChildRetrievers , List <QueryBuilder > newPreFilterQueryBuilders ) {
144- LinearRetrieverBuilder clone = new LinearRetrieverBuilder (newChildRetrievers , rankWindowSize , weights , normalizers , minScore );
130+ LinearRetrieverBuilder clone = new LinearRetrieverBuilder (newChildRetrievers , rankWindowSize , weights , normalizers );
145131 clone .preFilterQueryBuilders = newPreFilterQueryBuilders ;
146132 clone .retrieverName = retrieverName ;
147133 return clone ;
@@ -150,7 +136,6 @@ protected LinearRetrieverBuilder clone(List<RetrieverSource> newChildRetrievers,
150136 @ Override
151137 protected SearchSourceBuilder finalizeSourceBuilder (SearchSourceBuilder sourceBuilder ) {
152138 sourceBuilder .trackScores (true );
153- sourceBuilder .trackTotalHits (true );
154139 return sourceBuilder ;
155140 }
156141
@@ -161,9 +146,6 @@ protected RankDoc[] combineInnerRetrieverResults(List<ScoreDoc[]> rankResults, b
161146 for (int result = 0 ; result < rankResults .size (); result ++) {
162147 final ScoreNormalizer normalizer = normalizers [result ] == null ? IdentityScoreNormalizer .INSTANCE : normalizers [result ];
163148 ScoreDoc [] originalScoreDocs = rankResults .get (result );
164- if (originalScoreDocs == null ) {
165- continue ;
166- }
167149 ScoreDoc [] normalizedScoreDocs = normalizer .normalizeScores (originalScoreDocs );
168150 for (int scoreDocIndex = 0 ; scoreDocIndex < normalizedScoreDocs .length ; scoreDocIndex ++) {
169151 LinearRankDoc rankDoc = docsToRankResults .computeIfAbsent (
@@ -193,18 +175,12 @@ protected RankDoc[] combineInnerRetrieverResults(List<ScoreDoc[]> rankResults, b
193175 // sort the results based on the final score, tiebreaker based on smaller doc id
194176 LinearRankDoc [] sortedResults = docsToRankResults .values ().toArray (LinearRankDoc []::new );
195177 Arrays .sort (sortedResults );
196- int validCount = 0 ;
197- while (validCount < sortedResults .length && sortedResults [validCount ].score >= minScore ) {
198- validCount ++;
199- }
200- // trim the results to the minimum of rankWindowSize and the number of valid results
201- int finalSize = Math .min (rankWindowSize , validCount );
202- LinearRankDoc [] topResults = new LinearRankDoc [finalSize ];
178+ // trim the results if needed, otherwise each shard will always return `rank_window_size` results.
179+ LinearRankDoc [] topResults = new LinearRankDoc [Math .min (rankWindowSize , sortedResults .length )];
203180 for (int rank = 0 ; rank < topResults .length ; ++rank ) {
204181 topResults [rank ] = sortedResults [rank ];
205182 topResults [rank ].rank = rank + 1 ;
206183 }
207-
208184 return topResults ;
209185 }
210186
@@ -228,17 +204,5 @@ public void doToXContent(XContentBuilder builder, Params params) throws IOExcept
228204 builder .endArray ();
229205 }
230206 builder .field (RANK_WINDOW_SIZE_FIELD .getPreferredName (), rankWindowSize );
231- builder .field (MIN_SCORE_FIELD .getPreferredName (), minScore );
232- }
233-
234- @ Override
235- public Float minScore () {
236- return minScore ;
237- }
238-
239- @ Override
240- public RetrieverBuilder minScore (Float minScore ) {
241- this .minScore = minScore != null ? minScore : DEFAULT_MIN_SCORE ;
242- return this ;
243207 }
244208}
0 commit comments