Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/changelog/125659.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
pr: 125659
summary: Non existing synonyms sets do not fail shard recovery for indices
area: "Analysis"
type: bug
issues:
- 125603
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public ReaderWithOrigin getRulesReader(SynonymTokenFilterFactory factory, IndexC
);
} else {
reader = new ReaderWithOrigin(
Analysis.getReaderFromIndex(synonymsSet, factory.synonymsManagementAPIService),
Analysis.getReaderFromIndex(synonymsSet, factory.synonymsManagementAPIService, factory.lenient),
"[" + synonymsSet + "] synonyms_set in .synonyms index",
synonymsSet
);
Expand Down
3 changes: 0 additions & 3 deletions qa/mixed-cluster/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,6 @@ excludeList.add('aggregations/percentiles_hdr_metric/Negative values test')
// sync_id is removed in 9.0
excludeList.add("cat.shards/10_basic/Help")

// Can't work until auto-expand replicas is 0-1 for synonyms index
excludeList.add("synonyms/90_synonyms_reloading_for_synset/Reload analyzers for specific synonym set")
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unrelated to this change, but a good opportunity to enable this test again


def clusterPath = getPath()

buildParams.bwcVersions.withWireCompatible { bwcVersion, baseName ->
Expand Down
1 change: 1 addition & 0 deletions rest-api-spec/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,5 @@ tasks.named("yamlRestCompatTestTransform").configure ({ task ->
task.skipTest("indices.create/21_synthetic_source_stored/field param - keep nested array", "Synthetic source keep arrays now stores leaf arrays natively")
task.skipTest("indices.create/21_synthetic_source_stored/field param - keep root array", "Synthetic source keep arrays now stores leaf arrays natively")
task.skipTest("cluster.info/30_info_thread_pool/Cluster HTTP Info", "The search_throttled thread pool has been removed")
task.skipTest("synonyms/80_synonyms_from_index/Fail loading synonyms from index if synonyms_set doesn't exist", "Synonyms do no longer fail if the synonyms_set doesn't exist")
})
Original file line number Diff line number Diff line change
Expand Up @@ -313,3 +313,154 @@ setup:
indices.stats: { index: test_index }

- length: { indices: 0 }

---
"Load index with non existent synonyms set":
- requires:
cluster_features: [ index.synonyms_set_lenient_on_non_existing ]
reason: "requires synonyms_set_lenient_on_non_existing bug fix"
- do:
indices.create:
index: test_index
body:
settings:
index:
number_of_shards: 1
number_of_replicas: 0
analysis:
filter:
my_synonym_filter:
type: synonym
synonyms_set: set1
updateable: true
analyzer:
my_analyzer:
type: custom
tokenizer: whitespace
filter: [ lowercase, my_synonym_filter ]
mappings:
properties:
my_field:
type: text
search_analyzer: my_analyzer

- match: { acknowledged: true }
- match: { shards_acknowledged: true }

- do:
indices.stats: { index: test_index }

- match: { indices.test_index.health: "green" }

# Synonyms are not applied
- do:
indices.analyze:
index: test_index
body:
analyzer: my_analyzer
text: foo

- length: { tokens: 1 }
- match: { tokens.0.token: foo }


# Create synonyms set and check synonyms are applied
- do:
synonyms.put_synonym:
id: set1
body:
synonyms_set:
synonyms: "foo => bar, baz"

# This is to ensure that all index shards (write and read) are available. In serverless this can take some time.
- do:
cluster.health:
index: .synonyms
wait_for_status: green


- do:
indices.stats: { index: test_index }

- match: { indices.test_index.health: "green" }

# Synonyms are applied
- do:
indices.analyze:
index: test_index
body:
analyzer: my_analyzer
text: foo

- length: { tokens: 2 }

---
"Load index with non existent synonyms set and lenient set to false":

- do:
indices.create:
index: test_index
body:
settings:
index:
number_of_shards: 1
number_of_replicas: 0
analysis:
filter:
my_synonym_filter:
type: synonym
synonyms_set: set1
updateable: true
lenient: false
analyzer:
my_analyzer:
type: custom
tokenizer: whitespace
filter: [ lowercase, my_synonym_filter ]
mappings:
properties:
my_field:
type: text
search_analyzer: my_analyzer

- match: { acknowledged: true }
- match: { shards_acknowledged: false }

- do:
indices.stats: { index: test_index }

- length: { indices: 0 }

# Create synonyms set and check synonyms are applied
- do:
synonyms.put_synonym:
id: set1
body:
synonyms_set:
synonyms: "foo => bar, baz"

# This is to ensure that all index shards (write and read) are available. In serverless this can take some time.
- do:
cluster.health:
index: .synonyms
wait_for_status: green

- do:
cluster.reroute:
retry_failed: true

- do:
cluster.health:
index: test_index
wait_for_status: green

# Synonyms are applied
- do:
indices.analyze:
index: test_index
body:
analyzer: my_analyzer
text: foo

- length: { tokens: 2 }

Original file line number Diff line number Diff line change
Expand Up @@ -165,34 +165,6 @@ setup:
query: hola
- match: { hits.total.value: 1 }

---
"Fail loading synonyms from index if synonyms_set doesn't exist":
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I moved this test to 100_synonyms_invalid

- do:
indices.create:
index: another_index
body:
settings:
index:
number_of_shards: 1
analysis:
filter:
my_synonym_filter:
type: synonym
synonyms_set: set_missing
updateable: true
analyzer:
my_analyzer:
type: custom
tokenizer: standard
filter: [ lowercase, my_synonym_filter ]
mappings:
properties:
my_field:
type: text
search_analyzer: my_analyzer
- match: { acknowledged: true }
- match: { shards_acknowledged: false }

---
"Load empty synonyms set from index for an analyzer":
- do:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ public Set<NodeFeature> getFeatures() {

public static final NodeFeature LOGSDB_NO_HOST_NAME_FIELD = new NodeFeature("index.logsdb_no_host_name_field");

private static final NodeFeature SYNONYMS_SET_LENIENT_ON_NON_EXISTING = new NodeFeature("index.synonyms_set_lenient_on_non_existing");

@Override
public Set<NodeFeature> getTestFeatures() {
return Set.of(LOGSDB_NO_HOST_NAME_FIELD);
return Set.of(LOGSDB_NO_HOST_NAME_FIELD, SYNONYMS_SET_LENIENT_ON_NON_EXISTING);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.apache.lucene.analysis.th.ThaiAnalyzer;
import org.apache.lucene.analysis.tr.TurkishAnalyzer;
import org.apache.lucene.analysis.util.CSVUtil;
import org.elasticsearch.ResourceNotFoundException;
import org.elasticsearch.action.support.PlainActionFuture;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.settings.Settings;
Expand Down Expand Up @@ -353,10 +354,39 @@ public static Reader getReaderFromFile(Environment env, String filePath, String
}
}

public static Reader getReaderFromIndex(String synonymsSet, SynonymsManagementAPIService synonymsManagementAPIService) {
public static Reader getReaderFromIndex(
String synonymsSet,
SynonymsManagementAPIService synonymsManagementAPIService,
boolean ignoreMissing
) {
final PlainActionFuture<PagedResult<SynonymRule>> synonymsLoadingFuture = new PlainActionFuture<>();
synonymsManagementAPIService.getSynonymSetRules(synonymsSet, synonymsLoadingFuture);
PagedResult<SynonymRule> results = synonymsLoadingFuture.actionGet();

PagedResult<SynonymRule> results;

try {
results = synonymsLoadingFuture.actionGet();
} catch (Exception e) {
if (ignoreMissing == false) {
throw e;
}

boolean notFound = e instanceof ResourceNotFoundException;
String message = String.format(
Locale.ROOT,
"Synonyms set %s %s. Synonyms will not be applied to search results on indices that use this synonym set",
synonymsSet,
notFound ? "not found" : "could not be loaded"
);

if (notFound) {
logger.warn(message);
} else {
logger.error(message, e);
}

results = new PagedResult<>(0, new SynonymRule[0]);
}

SynonymRule[] synonymRules = results.pageResults();
StringBuilder sb = new StringBuilder();
Expand Down
Loading