Skip to content

Commit f22631a

Browse files
authored
Fix upgrade of custom similarity (#50851)
This change fixes the upgrade of index metadata that contain a custom similarity with options that are not compatible with BM25. The upgrade doesn't need a real similarity service so we fake one that resolves all custom similarity to BM25 but this logic fails because the BM25 provider checks that all options are compatible. This commit removes the verification step as it is not needed during the upgrade (the verification is done when the index is restored/opened). Closes #50763
1 parent 57518a0 commit f22631a

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataIndexUpgradeService.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.logging.log4j.Logger;
2323
import org.apache.logging.log4j.message.ParameterizedMessage;
2424
import org.apache.lucene.analysis.Analyzer;
25+
import org.apache.lucene.search.similarities.BM25Similarity;
2526
import org.apache.lucene.search.similarities.Similarity;
2627
import org.elasticsearch.Version;
2728
import org.elasticsearch.common.TriFunction;
@@ -145,7 +146,7 @@ public boolean containsKey(Object key) {
145146
@Override
146147
public TriFunction<Settings, Version, ScriptService, Similarity> get(Object key) {
147148
assert key instanceof String : "key must be a string but was: " + key.getClass();
148-
return SimilarityService.BUILT_IN.get(SimilarityService.DEFAULT_SIMILARITY);
149+
return (settings, version, scriptService) -> new BM25Similarity();
149150
}
150151

151152
// this entrySet impl isn't fully correct but necessary as SimilarityService will iterate

server/src/test/java/org/elasticsearch/cluster/metadata/MetaDataIndexUpgradeServiceTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ public void testUpgrade() {
8282
assertSame(src, service.upgradeIndexMetaData(src, Version.CURRENT.minimumIndexCompatibilityVersion())); // no double upgrade
8383
}
8484

85+
public void testUpgradeCustomSimilarity() {
86+
MetaDataIndexUpgradeService service = getMetaDataIndexUpgradeService();
87+
IndexMetaData src = newIndexMeta("foo",
88+
Settings.builder()
89+
.put("index.similarity.my_similarity.type", "DFR")
90+
.put("index.similarity.my_similarity.after_effect", "l")
91+
.build());
92+
assertFalse(service.isUpgraded(src));
93+
src = service.upgradeIndexMetaData(src, Version.CURRENT.minimumIndexCompatibilityVersion());
94+
assertTrue(service.isUpgraded(src));
95+
}
96+
8597
public void testIsUpgraded() {
8698
MetaDataIndexUpgradeService service = getMetaDataIndexUpgradeService();
8799
IndexMetaData src = newIndexMeta("foo", Settings.builder().put("index.refresh_interval", "-200").build());

0 commit comments

Comments
 (0)