Skip to content

Commit 37c27e0

Browse files
authored
Support semantic reranking using contextual snippets instead of entire field text (#129369)
1 parent 69a7d41 commit 37c27e0

File tree

34 files changed

+893
-139
lines changed

34 files changed

+893
-139
lines changed

docs/changelog/129369.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 129369
2+
summary: Support semantic reranking using contextual snippets instead of entire field
3+
text
4+
area: Relevance
5+
type: enhancement
6+
issues: []

qa/ccs-common-rest/src/yamlRestTest/java/org/elasticsearch/test/rest/yaml/CcsCommonYamlTestSuiteIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ public class CcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
9292
.feature(FeatureFlag.TIME_SERIES_MODE)
9393
.feature(FeatureFlag.SUB_OBJECTS_AUTO_ENABLED)
9494
.feature(FeatureFlag.IVF_FORMAT)
95-
.feature(FeatureFlag.SYNTHETIC_VECTORS);
95+
.feature(FeatureFlag.SYNTHETIC_VECTORS)
96+
.feature(FeatureFlag.RERANK_SNIPPETS);
9697

9798
private static ElasticsearchCluster remoteCluster = ElasticsearchCluster.local()
9899
.name(REMOTE_CLUSTER_NAME)

qa/ccs-common-rest/src/yamlRestTest/java/org/elasticsearch/test/rest/yaml/RcsCcsCommonYamlTestSuiteIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public class RcsCcsCommonYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
9494
.feature(FeatureFlag.SUB_OBJECTS_AUTO_ENABLED)
9595
.feature(FeatureFlag.IVF_FORMAT)
9696
.feature(FeatureFlag.SYNTHETIC_VECTORS)
97+
.feature(FeatureFlag.RERANK_SNIPPETS)
9798
.user("test_admin", "x-pack-test-password");
9899

99100
private static ElasticsearchCluster fulfillingCluster = ElasticsearchCluster.local()

qa/smoke-test-multinode/src/yamlRestTest/java/org/elasticsearch/smoketest/SmokeTestMultiNodeClientYamlTestSuiteIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class SmokeTestMultiNodeClientYamlTestSuiteIT extends ESClientYamlSuiteTe
4040
.feature(FeatureFlag.USE_LUCENE101_POSTINGS_FORMAT)
4141
.feature(FeatureFlag.IVF_FORMAT)
4242
.feature(FeatureFlag.SYNTHETIC_VECTORS)
43+
.feature(FeatureFlag.RERANK_SNIPPETS)
4344
.build();
4445

4546
public SmokeTestMultiNodeClientYamlTestSuiteIT(@Name("yaml") ClientYamlTestCandidate testCandidate) {

rest-api-spec/src/yamlRestTest/java/org/elasticsearch/test/rest/ClientYamlTestSuiteIT.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class ClientYamlTestSuiteIT extends ESClientYamlSuiteTestCase {
4040
.feature(FeatureFlag.USE_LUCENE101_POSTINGS_FORMAT)
4141
.feature(FeatureFlag.IVF_FORMAT)
4242
.feature(FeatureFlag.SYNTHETIC_VECTORS)
43+
.feature(FeatureFlag.RERANK_SNIPPETS)
4344
.build();
4445

4546
public ClientYamlTestSuiteIT(@Name("yaml") ClientYamlTestCandidate testCandidate) {

server/src/internalClusterTest/java/org/elasticsearch/search/rank/FieldBasedRerankerIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public RankShardResult buildRankFeatureShardResult(SearchHits hits, int shardId)
193193
RankFeatureDoc[] rankFeatureDocs = new RankFeatureDoc[hits.getHits().length];
194194
for (int i = 0; i < hits.getHits().length; i++) {
195195
rankFeatureDocs[i] = new RankFeatureDoc(hits.getHits()[i].docId(), hits.getHits()[i].getScore(), shardId);
196-
rankFeatureDocs[i].featureData(hits.getHits()[i].field(field).getValue().toString());
196+
rankFeatureDocs[i].featureData(List.of(hits.getHits()[i].field(field).getValue().toString()));
197197
}
198198
return new RankFeatureShardResult(rankFeatureDocs);
199199
} catch (Exception ex) {
@@ -210,7 +210,7 @@ public RankFeaturePhaseRankCoordinatorContext buildRankFeaturePhaseCoordinatorCo
210210
protected void computeScores(RankFeatureDoc[] featureDocs, ActionListener<float[]> scoreListener) {
211211
float[] scores = new float[featureDocs.length];
212212
for (int i = 0; i < featureDocs.length; i++) {
213-
scores[i] = Float.parseFloat(featureDocs[i].featureData);
213+
scores[i] = Float.parseFloat(featureDocs[i].featureData.get(0));
214214
}
215215
scoreListener.onResponse(scores);
216216
}

server/src/internalClusterTest/java/org/elasticsearch/search/rank/MockedRequestActionBasedRerankerIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ protected void computeScores(RankFeatureDoc[] featureDocs, ActionListener<float[
275275
l.onResponse(scores);
276276
});
277277

278-
List<String> featureData = Arrays.stream(featureDocs).map(x -> x.featureData).toList();
278+
List<String> featureData = Arrays.stream(featureDocs).map(x -> x.featureData).flatMap(List::stream).toList();
279279
TestRerankingActionRequest request = generateRequest(featureData);
280280
try {
281281
ActionType<TestRerankingActionResponse> action = actionType();

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ static TransportVersion def(int id) {
352352
public static final TransportVersion ESQL_SAMPLE_OPERATOR_STATUS = def(9_127_0_00);
353353
public static final TransportVersion ESQL_TOPN_TIMINGS = def(9_128_0_00);
354354
public static final TransportVersion NODE_WEIGHTS_ADDED_TO_NODE_BALANCE_STATS = def(9_129_0_00);
355+
public static final TransportVersion RERANK_SNIPPETS = def(9_130_0_00);
355356

356357
/*
357358
* STOP! READ THIS FIRST! No, really,

server/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,9 +1187,11 @@ public SearchSourceBuilder rewrite(QueryRewriteContext context) throws IOExcepti
11871187
sliceBuilder,
11881188
sorts,
11891189
rescoreBuilders,
1190-
highlightBuilder
1190+
highlightBuilder,
1191+
rankBuilder
11911192
)
11921193
));
1194+
11931195
if (retrieverBuilder != null) {
11941196
var newRetriever = retrieverBuilder.rewrite(context);
11951197
if (newRetriever != retrieverBuilder) {
@@ -1205,6 +1207,11 @@ public SearchSourceBuilder rewrite(QueryRewriteContext context) throws IOExcepti
12051207
}
12061208
}
12071209

1210+
RankBuilder rankBuilder = null;
1211+
if (this.rankBuilder != null) {
1212+
rankBuilder = this.rankBuilder.rewrite(context);
1213+
}
1214+
12081215
List<SubSearchSourceBuilder> subSearchSourceBuilders = Rewriteable.rewrite(this.subSearchSourceBuilders, context);
12091216
QueryBuilder postQueryBuilder = null;
12101217
if (this.postQueryBuilder != null) {
@@ -1229,7 +1236,8 @@ public SearchSourceBuilder rewrite(QueryRewriteContext context) throws IOExcepti
12291236
|| aggregations != this.aggregations
12301237
|| rescoreBuilders != this.rescoreBuilders
12311238
|| sorts != this.sorts
1232-
|| this.highlightBuilder != highlightBuilder;
1239+
|| this.highlightBuilder != highlightBuilder
1240+
|| this.rankBuilder != rankBuilder;
12331241
if (rewritten) {
12341242
return shallowCopy(
12351243
subSearchSourceBuilders,
@@ -1239,7 +1247,8 @@ public SearchSourceBuilder rewrite(QueryRewriteContext context) throws IOExcepti
12391247
this.sliceBuilder,
12401248
sorts,
12411249
rescoreBuilders,
1242-
highlightBuilder
1250+
highlightBuilder,
1251+
rankBuilder
12431252
);
12441253
}
12451254
return this;
@@ -1257,7 +1266,8 @@ public SearchSourceBuilder shallowCopy() {
12571266
sliceBuilder,
12581267
sorts,
12591268
rescoreBuilders,
1260-
highlightBuilder
1269+
highlightBuilder,
1270+
rankBuilder
12611271
);
12621272
}
12631273

@@ -1274,7 +1284,8 @@ private SearchSourceBuilder shallowCopy(
12741284
SliceBuilder slice,
12751285
List<SortBuilder<?>> sorts,
12761286
List<RescorerBuilder> rescoreBuilders,
1277-
HighlightBuilder highlightBuilder
1287+
HighlightBuilder highlightBuilder,
1288+
RankBuilder rankBuilder
12781289
) {
12791290
SearchSourceBuilder rewrittenBuilder = new SearchSourceBuilder();
12801291
rewrittenBuilder.aggregations = aggregations;

server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ public Field(String name) {
399399
this.name = name;
400400
}
401401

402-
private Field(Field template, QueryBuilder builder) {
402+
Field(Field template, QueryBuilder builder) {
403403
super(template, builder);
404404
name = template.name;
405405
fragmentOffset = template.fragmentOffset;

0 commit comments

Comments
 (0)