Skip to content

Commit 60308cf

Browse files
committed
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 ae83082 commit 60308cf

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;
@@ -148,7 +149,7 @@ public boolean containsKey(Object key) {
148149
@Override
149150
public TriFunction<Settings, Version, ScriptService, Similarity> get(Object key) {
150151
assert key instanceof String : "key must be a string but was: " + key.getClass();
151-
return SimilarityService.BUILT_IN.get(SimilarityService.DEFAULT_SIMILARITY);
152+
return (settings, version, scriptService) -> new BM25Similarity();
152153
}
153154

154155
// 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
@@ -81,6 +81,18 @@ public void testUpgrade() {
8181
assertSame(src, service.upgradeIndexMetaData(src, Version.CURRENT.minimumIndexCompatibilityVersion())); // no double upgrade
8282
}
8383

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

0 commit comments

Comments
 (0)