Skip to content

Commit 80b27c8

Browse files
Merge branch '9.0' into backport-90-consider-aborting-merges-while-enqueued
2 parents 9ad2375 + 60f47cc commit 80b27c8

File tree

10 files changed

+292
-72
lines changed

10 files changed

+292
-72
lines changed

docs/changelog/129223.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 129223
2+
summary: Fix text similarity reranker does not propagate min score correctly
3+
area: Search
4+
type: bug
5+
issues: []

muted-tests.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,9 @@ tests:
288288
- class: org.elasticsearch.index.engine.ThreadPoolMergeExecutorServiceTests
289289
method: testIORateIsAdjustedForAllRunningMergeTasks
290290
issue: https://github.com/elastic/elasticsearch/issues/129531
291+
- class: org.elasticsearch.packaging.test.DockerTests
292+
method: test600Interrupt
293+
issue: https://github.com/elastic/elasticsearch/issues/128144
291294

292295
# Examples:
293296
#

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ public void onFailure(Exception e) {
195195
RankDocsRetrieverBuilder rankDocsRetrieverBuilder = new RankDocsRetrieverBuilder(
196196
rankWindowSize,
197197
newRetrievers.stream().map(s -> s.retriever).toList(),
198-
results::get
198+
results::get,
199+
this.minScore
199200
);
200201
rankDocsRetrieverBuilder.retrieverName(retrieverName());
201202
return rankDocsRetrieverBuilder;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ public class RankDocsRetrieverBuilder extends RetrieverBuilder {
3333
final List<RetrieverBuilder> sources;
3434
final Supplier<RankDoc[]> rankDocs;
3535

36-
public RankDocsRetrieverBuilder(int rankWindowSize, List<RetrieverBuilder> sources, Supplier<RankDoc[]> rankDocs) {
36+
public RankDocsRetrieverBuilder(int rankWindowSize, List<RetrieverBuilder> sources, Supplier<RankDoc[]> rankDocs, Float minScore) {
3737
this.rankWindowSize = rankWindowSize;
3838
this.rankDocs = rankDocs;
3939
if (sources == null || sources.isEmpty()) {
4040
throw new IllegalArgumentException("sources must not be null or empty");
4141
}
4242
this.sources = sources;
43+
this.minScore = minScore;
4344
}
4445

4546
@Override
@@ -48,7 +49,7 @@ public String getName() {
4849
}
4950

5051
private boolean sourceHasMinScore() {
51-
return minScore != null || sources.stream().anyMatch(x -> x.minScore() != null);
52+
return this.minScore != null || sources.stream().anyMatch(x -> x.minScore() != null);
5253
}
5354

5455
private boolean sourceShouldRewrite(QueryRewriteContext ctx) throws IOException {
@@ -132,7 +133,7 @@ public void extractToSearchSourceBuilder(SearchSourceBuilder searchSourceBuilder
132133
searchSourceBuilder.size(rankWindowSize);
133134
}
134135
if (sourceHasMinScore()) {
135-
searchSourceBuilder.minScore(this.minScore() == null ? Float.MIN_VALUE : this.minScore());
136+
searchSourceBuilder.minScore(this.minScore == null ? Float.MIN_VALUE : this.minScore);
136137
}
137138
if (searchSourceBuilder.size() + searchSourceBuilder.from() > rankDocResults.length) {
138139
searchSourceBuilder.size(Math.max(0, rankDocResults.length - searchSourceBuilder.from()));

server/src/test/java/org/elasticsearch/search/retriever/RankDocsRetrieverBuilderTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ private List<QueryBuilder> preFilters(QueryRewriteContext queryRewriteContext) t
9797
}
9898

9999
private RankDocsRetrieverBuilder createRandomRankDocsRetrieverBuilder(QueryRewriteContext queryRewriteContext) throws IOException {
100-
return new RankDocsRetrieverBuilder(randomIntBetween(1, 100), innerRetrievers(queryRewriteContext), rankDocsSupplier());
100+
return new RankDocsRetrieverBuilder(randomIntBetween(1, 100), innerRetrievers(queryRewriteContext), rankDocsSupplier(), null);
101101
}
102102

103103
public void testExtractToSearchSourceBuilder() throws IOException {

x-pack/plugin/inference/qa/test-service-plugin/src/main/java/org/elasticsearch/xpack/inference/mock/TestRerankingServiceExtension.java

Lines changed: 21 additions & 8 deletions
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.Comparator;
3940
import java.util.EnumSet;
4041
import java.util.HashMap;
4142
import java.util.List;
@@ -148,16 +149,28 @@ public void chunkedInfer(
148149
}
149150

150151
private RankedDocsResults makeResults(List<String> input) {
151-
List<RankedDocsResults.RankedDoc> results = new ArrayList<>();
152152
int totalResults = input.size();
153-
float minScore = random.nextFloat(-1f, 1f);
154-
float resultDiff = 0.2f;
155-
for (int i = 0; i < input.size(); i++) {
156-
results.add(
157-
new RankedDocsResults.RankedDoc(totalResults - 1 - i, minScore + resultDiff * (totalResults - i), input.get(i))
158-
);
153+
try {
154+
List<RankedDocsResults.RankedDoc> results = new ArrayList<>();
155+
for (int i = 0; i < totalResults; i++) {
156+
results.add(new RankedDocsResults.RankedDoc(i, Float.parseFloat(input.get(i)), input.get(i)));
157+
}
158+
return new RankedDocsResults(results.stream().sorted(Comparator.reverseOrder()).toList());
159+
} catch (NumberFormatException ex) {
160+
List<RankedDocsResults.RankedDoc> results = new ArrayList<>();
161+
float minScore = random.nextFloat(-1f, 1f);
162+
float resultDiff = 0.2f;
163+
for (int i = 0; i < input.size(); i++) {
164+
results.add(
165+
new RankedDocsResults.RankedDoc(
166+
totalResults - 1 - i,
167+
minScore + resultDiff * (totalResults - i),
168+
input.get(totalResults - 1 - i)
169+
)
170+
);
171+
}
172+
return new RankedDocsResults(results);
159173
}
160-
return new RankedDocsResults(results);
161174
}
162175

163176
protected ServiceSettings getServiceSettingsFromMap(Map<String, Object> serviceSettingsMap) {

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public class InferenceFeatures implements FeatureSpecification {
2828
private static final NodeFeature SEMANTIC_TEXT_HIGHLIGHTER = new NodeFeature("semantic_text.highlighter");
2929
private static final NodeFeature SEMANTIC_TEXT_HIGHLIGHTER_DEFAULT = new NodeFeature("semantic_text.highlighter.default");
3030
private static final NodeFeature SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER = new NodeFeature("semantic_text.match_all_highlighter");
31+
private static final NodeFeature TEST_RERANKING_SERVICE_PARSE_TEXT_AS_SCORE = new NodeFeature(
32+
"test_reranking_service.parse_text_as_score"
33+
);
3134

3235
@Override
3336
public Set<NodeFeature> getTestFeatures() {
@@ -44,10 +47,12 @@ public Set<NodeFeature> getTestFeatures() {
4447
SemanticInferenceMetadataFieldsMapper.EXPLICIT_NULL_FIXES,
4548
SEMANTIC_KNN_VECTOR_QUERY_REWRITE_INTERCEPTION_SUPPORTED,
4649
TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_ALIAS_HANDLING_FIX,
50+
TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_MINSCORE_FIX,
4751
SemanticInferenceMetadataFieldsMapper.INFERENCE_METADATA_FIELDS_ENABLED_BY_DEFAULT,
4852
SEMANTIC_TEXT_HIGHLIGHTER_DEFAULT,
4953
SEMANTIC_KNN_FILTER_FIX,
50-
SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER
54+
SEMANTIC_TEXT_MATCH_ALL_HIGHLIGHTER,
55+
TEST_RERANKING_SERVICE_PARSE_TEXT_AS_SCORE
5156
);
5257
}
5358
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.xcontent.XContentParser;
2424

2525
import java.io.IOException;
26+
import java.util.ArrayList;
2627
import java.util.List;
2728
import java.util.Objects;
2829

@@ -39,6 +40,7 @@ public class TextSimilarityRankRetrieverBuilder extends CompoundRetrieverBuilder
3940
public static final NodeFeature TEXT_SIMILARITY_RERANKER_ALIAS_HANDLING_FIX = new NodeFeature(
4041
"text_similarity_reranker_alias_handling_fix"
4142
);
43+
public static final NodeFeature TEXT_SIMILARITY_RERANKER_MINSCORE_FIX = new NodeFeature("text_similarity_reranker_minscore_fix");
4244

4345
public static final ParseField RETRIEVER_FIELD = new ParseField("retriever");
4446
public static final ParseField INFERENCE_ID_FIELD = new ParseField("inference_id");
@@ -141,23 +143,21 @@ protected TextSimilarityRankRetrieverBuilder clone(
141143
protected RankDoc[] combineInnerRetrieverResults(List<ScoreDoc[]> rankResults, boolean explain) {
142144
assert rankResults.size() == 1;
143145
ScoreDoc[] scoreDocs = rankResults.getFirst();
144-
TextSimilarityRankDoc[] textSimilarityRankDocs = new TextSimilarityRankDoc[scoreDocs.length];
146+
List<TextSimilarityRankDoc> filteredDocs = new ArrayList<>();
147+
// Filtering by min_score must be done here, after reranking.
148+
// Applying min_score in the child retriever could prematurely exclude documents that would receive high scores from the reranker.
145149
for (int i = 0; i < scoreDocs.length; i++) {
146150
ScoreDoc scoreDoc = scoreDocs[i];
147151
assert scoreDoc.score >= 0;
148-
if (explain) {
149-
textSimilarityRankDocs[i] = new TextSimilarityRankDoc(
150-
scoreDoc.doc,
151-
scoreDoc.score,
152-
scoreDoc.shardIndex,
153-
inferenceId,
154-
field
155-
);
156-
} else {
157-
textSimilarityRankDocs[i] = new TextSimilarityRankDoc(scoreDoc.doc, scoreDoc.score, scoreDoc.shardIndex);
152+
if (minScore == null || scoreDoc.score >= minScore) {
153+
if (explain) {
154+
filteredDocs.add(new TextSimilarityRankDoc(scoreDoc.doc, scoreDoc.score, scoreDoc.shardIndex, inferenceId, field));
155+
} else {
156+
filteredDocs.add(new TextSimilarityRankDoc(scoreDoc.doc, scoreDoc.score, scoreDoc.shardIndex));
157+
}
158158
}
159159
}
160-
return textSimilarityRankDocs;
160+
return filteredDocs.toArray(new TextSimilarityRankDoc[0]);
161161
}
162162

163163
@Override

0 commit comments

Comments
 (0)