Skip to content

Commit 5cea709

Browse files
reakaleekclaude
andcommitted
Search: Change synonyms from dictionary to flat list
The dictionary structure used the first term as the key and Skip(1) for values, which artificially separated one synonym from its group. This caused the key term to be omitted from synonym rules sent to Elasticsearch. Replace Dictionary<string, string[]> with IReadOnlyList<string[]> so all terms in a synonym group are treated equally. The first term is still used as the ES rule ID for readability but is no longer excluded from the synonym string. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 11111e2 commit 5cea709

File tree

9 files changed

+30
-28
lines changed

9 files changed

+30
-28
lines changed

.superset/config.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"setup": [
3+
"dotnet tool restore && dotnet husky install"
4+
],
5+
"teardown": [],
6+
"run": []
7+
}

src/Elastic.Documentation.Configuration/Search/SearchConfiguration.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,16 @@ namespace Elastic.Documentation.Configuration.Search;
99

1010
public record SearchConfiguration
1111
{
12-
private readonly IReadOnlyDictionary<string, string[]> _synonyms;
12+
private readonly IReadOnlyList<string[]> _synonyms;
1313

14-
public required IReadOnlyDictionary<string, string[]> Synonyms
14+
public required IReadOnlyList<string[]> Synonyms
1515
{
1616
get => _synonyms;
1717
[MemberNotNull(nameof(_synonyms))]
1818
init
1919
{
2020
_synonyms = value;
2121
SynonymBiDirectional = value
22-
.Select(kv => kv.Value.Concat([kv.Key]).ToArray())
2322
.SelectMany(a =>
2423
{
2524
var targets = new List<string[]>();
@@ -120,15 +119,17 @@ public static class SearchConfigurationExtensions
120119
public static SearchConfiguration CreateSearchConfiguration(this ConfigurationFileProvider provider)
121120
{
122121
var searchFile = provider.SearchFile;
123-
var synonyms = new Dictionary<string, string[]>();
124122

125123
if (!searchFile.Exists)
126-
return new SearchConfiguration { Synonyms = synonyms, Rules = [], DiminishTerms = [] };
124+
return new SearchConfiguration { Synonyms = [], Rules = [], DiminishTerms = [] };
127125

128126
var searchDto = ConfigurationFileProvider.Deserializer.Deserialize<SearchConfigDto>(searchFile.OpenText());
129-
synonyms = searchDto.Synonyms
127+
var synonyms = searchDto.Synonyms
130128
.Where(s => s.Count > 1)
131-
.ToDictionary(k => k[0], sl => sl.Skip(1).ToArray(), StringComparer.OrdinalIgnoreCase);
129+
.Select(s => s.ToArray())
130+
.GroupBy(s => s[0], StringComparer.OrdinalIgnoreCase)
131+
.Select(g => g.First())
132+
.ToArray();
132133
var rules = searchDto.Rules.Select(ParseRule).ToImmutableArray();
133134
var diminishTerms = searchDto.DiminishTerms.ToImmutableArray();
134135
return new SearchConfiguration { Synonyms = synonyms, Rules = rules, DiminishTerms = diminishTerms };
@@ -154,4 +155,4 @@ private static QueryRuleCriteria ParseCriteria(QueryRuleCriteriaDto dto) =>
154155
Metadata = dto.Metadata,
155156
Values = dto.Values.ToImmutableArray()
156157
};
157-
}
158+
}

src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public partial class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposa
3838
private readonly ElasticsearchTypeContext _semanticTypeContext;
3939

4040
private readonly VersionsConfiguration _versionsConfiguration;
41-
private readonly IReadOnlyDictionary<string, string[]> _synonyms;
41+
private readonly IReadOnlyList<string[]> _synonyms;
4242
private readonly IReadOnlyCollection<QueryRule> _rules;
4343
private readonly string _fixedSynonymsHash;
4444

@@ -74,12 +74,10 @@ IDocumentationConfigurationContext context
7474
_operations = new ElasticsearchOperations(_transport, _logger, collector);
7575

7676
string[] fixedSynonyms = ["esql", "data-stream", "data-streams", "machine-learning"];
77-
var indexTimeSynonyms = _synonyms.Aggregate(new List<SynonymRule>(), (acc, synonym) =>
78-
{
79-
var id = synonym.Key;
80-
acc.Add(new SynonymRule { Id = id, Synonyms = string.Join(", ", synonym.Value) });
81-
return acc;
82-
}).Where(r => fixedSynonyms.Contains(r.Id)).Select(r => r.Synonyms).ToArray();
77+
var indexTimeSynonyms = _synonyms
78+
.Where(s => s.Any(t => fixedSynonyms.Contains(t)))
79+
.Select(s => string.Join(", ", s))
80+
.ToArray();
8381
_fixedSynonymsHash = HashedBulkUpdate.CreateHash(string.Join(",", indexTimeSynonyms));
8482

8583
var synonymSetName = $"docs-{_buildType}-{_environment}";
@@ -235,13 +233,9 @@ private async Task PublishSynonymsAsync(Cancel ctx)
235233
var setName = $"docs-{_buildType}-{_environment}";
236234
_logger.LogInformation("Publishing synonym set '{SetName}' to Elasticsearch", setName);
237235

238-
var synonymRules = _synonyms.Aggregate(new List<SynonymRule>(), (acc, synonym) =>
239-
{
240-
var id = synonym.Key;
241-
var synonyms = string.Join(", ", [id, .. synonym.Value]);
242-
acc.Add(new SynonymRule { Id = id, Synonyms = synonyms });
243-
return acc;
244-
});
236+
var synonymRules = _synonyms
237+
.Select(s => new SynonymRule { Id = s[0], Synonyms = string.Join(", ", s) })
238+
.ToList();
245239

246240
var synonymsSet = new SynonymsSet { Synonyms = synonymRules };
247241
await PutSynonyms(synonymsSet, setName, ctx);

tests-integration/Elastic.Assembler.IntegrationTests/TestHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static IConfigurationContext CreateConfigurationContext(
5757
ProductDisplayNames = products.ToDictionary(p => p.Key, p => p.Value.DisplayName).ToFrozenDictionary()
5858
};
5959
}
60-
var search = new SearchConfiguration { Synonyms = new Dictionary<string, string[]>(), Rules = [], DiminishTerms = [] };
60+
var search = new SearchConfiguration { Synonyms = [], Rules = [], DiminishTerms = [] };
6161
return new ConfigurationContext
6262
{
6363
Endpoints = new DocumentationEndpoints

tests-integration/Mcp.Remote.IntegrationTests/McpToolsIntegrationTestsBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private static ElasticsearchClientAccessor CreateElasticsearchClientAccessor()
9292

9393
var searchConfig = new SearchConfiguration
9494
{
95-
Synonyms = new Dictionary<string, string[]>(),
95+
Synonyms = [],
9696
Rules = [],
9797
DiminishTerms = ["plugin", "client", "integration", "glossary"]
9898
};

tests/Elastic.ApiExplorer.Tests/TestHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static IConfigurationContext CreateConfigurationContext(IFileSystem fileS
5353
ProductDisplayNames = products.ToDictionary(p => p.Key, p => p.Value.DisplayName).ToFrozenDictionary()
5454
};
5555
}
56-
var search = new SearchConfiguration { Synonyms = new Dictionary<string, string[]>(), Rules = [], DiminishTerms = [] };
56+
var search = new SearchConfiguration { Synonyms = [], Rules = [], DiminishTerms = [] };
5757
return new ConfigurationContext
5858
{
5959
Endpoints = new DocumentationEndpoints

tests/Elastic.Changelog.Tests/Changelogs/ChangelogTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ protected ChangelogTestBase(ITestOutputHelper output)
103103
ConfigurationFileProvider = new ConfigurationFileProvider(NullLoggerFactory.Instance, FileSystem),
104104
VersionsConfiguration = versionsConfiguration,
105105
ProductsConfiguration = productsConfiguration,
106-
SearchConfiguration = new SearchConfiguration { Synonyms = new Dictionary<string, string[]>(), Rules = [], DiminishTerms = [] },
106+
SearchConfiguration = new SearchConfiguration { Synonyms = [], Rules = [], DiminishTerms = [] },
107107
LegacyUrlMappings = new LegacyUrlMappingConfiguration { Mappings = [] },
108108
};
109109
}

tests/Elastic.Documentation.Build.Tests/TestHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static IConfigurationContext CreateConfigurationContext(
6262
};
6363
}
6464

65-
var search = new SearchConfiguration { Synonyms = new Dictionary<string, string[]>(), Rules = [], DiminishTerms = [] };
65+
var search = new SearchConfiguration { Synonyms = [], Rules = [], DiminishTerms = [] };
6666
return new ConfigurationContext
6767
{
6868
Endpoints = new DocumentationEndpoints

tests/Elastic.Markdown.Tests/TestHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public static IConfigurationContext CreateConfigurationContext(IFileSystem fileS
106106
ProductDisplayNames = products.ToDictionary(p => p.Key, p => p.Value.DisplayName).ToFrozenDictionary()
107107
};
108108
}
109-
var search = new SearchConfiguration { Synonyms = new Dictionary<string, string[]>(), Rules = [], DiminishTerms = [] };
109+
var search = new SearchConfiguration { Synonyms = [], Rules = [], DiminishTerms = [] };
110110
return new ConfigurationContext
111111
{
112112
Endpoints = new DocumentationEndpoints

0 commit comments

Comments
 (0)