Skip to content

Commit 16ca93f

Browse files
committed
iter
1 parent ffe73dc commit 16ca93f

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

server/src/main/java/org/elasticsearch/action/search/QueryPhaseResultConsumer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.common.io.stream.DelayableWriteable;
1919
import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore;
2020
import org.elasticsearch.common.util.concurrent.AbstractRunnable;
21+
import org.elasticsearch.index.query.RankDocsQueryBuilder;
2122
import org.elasticsearch.search.SearchPhaseResult;
2223
import org.elasticsearch.search.SearchService;
2324
import org.elasticsearch.search.SearchShardTarget;
@@ -62,6 +63,7 @@ public class QueryPhaseResultConsumer extends ArraySearchPhaseResults<SearchPhas
6263
private final boolean hasTopDocs;
6364
private final boolean hasAggs;
6465
private final boolean performFinalReduce;
66+
private final boolean isRankQuery;
6567

6668
private final Consumer<Exception> onPartialMergeFailure;
6769

@@ -116,6 +118,7 @@ public QueryPhaseResultConsumer(
116118
this.aggReduceContextBuilder = hasAggs ? controller.getReduceContext(isCanceled, source.aggregations()) : null;
117119
batchReduceSize = (hasAggs || hasTopDocs) ? Math.min(request.getBatchedReduceSize(), expectedResultSize) : expectedResultSize;
118120
topDocsStats = new TopDocsStats(request.resolveTrackTotalHitsUpTo());
121+
isRankQuery = source != null && source.query() instanceof RankDocsQueryBuilder;
119122
}
120123

121124
@Override

server/src/main/java/org/elasticsearch/search/retriever/CompoundRetrieverBuilder.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
import java.io.IOException;
3838
import java.util.ArrayList;
39+
import java.util.Arrays;
3940
import java.util.List;
4041
import java.util.Locale;
4142
import java.util.Objects;
@@ -181,7 +182,8 @@ public void onResponse(MultiSearchResponse items) {
181182
failures.forEach(ex::addSuppressed);
182183
listener.onFailure(ex);
183184
} else {
184-
results.set(combineInnerRetrieverResults(topDocs, ctx.isExplain()));
185+
RankDoc[] combinedResults = combineInnerRetrieverResults(topDocs, ctx.isExplain());
186+
results.set(normalizeRankDocs(combinedResults));
185187
listener.onResponse(null);
186188
}
187189
}
@@ -299,6 +301,17 @@ protected SearchSourceBuilder finalizeSourceBuilder(SearchSourceBuilder sourceBu
299301
return sourceBuilder;
300302
}
301303

304+
private RankDoc[] normalizeRankDocs(RankDoc[] rankDocs) {
305+
// normalize scores according to
306+
// score = max(score, 0) + min(exp(score), 1)
307+
// this maps negative numbers to (0, 1) and positive numbers to [1, inf)
308+
// which is really useful as we don't want to push down negative scores
309+
for (RankDoc rankDoc : rankDocs) {
310+
rankDoc.score = (float) (Math.max(rankDoc.score, 0) + Math.min(Math.exp(rankDoc.score), 1));
311+
}
312+
return rankDocs;
313+
}
314+
302315
private RankDoc[] getRankDocs(SearchResponse searchResponse) {
303316
int size = searchResponse.getHits().getHits().length;
304317
RankDoc[] docs = new RankDoc[size];

0 commit comments

Comments
 (0)