From 9e43e734f476b463c67e983af9802cc3c4e68831 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Thu, 23 Oct 2025 12:08:35 +0200 Subject: [PATCH 1/4] Fix synonyms --- .../ElasticsearchMarkdownExporter.cs | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs index d3662d3d5..9b754761e 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs @@ -32,7 +32,8 @@ internal sealed record SynonymSetRequest } [JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower)] -[JsonSerializable(typeof(SynonymSetRequest))] +[JsonSerializable(typeof(SynonymsSet))] +[JsonSerializable(typeof(SynonymRule))] internal sealed partial class SynonymSerializerContext : JsonSerializerContext { }; public class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposable @@ -153,8 +154,22 @@ private async Task PublishSynonymsAsync(string setName, CancellationToken ctx) { _logger.LogInformation("Publishing synonym set '{SetName}' to Elasticsearch", setName); - var requestBody = new SynonymSetRequest { Synonyms = _synonyms.ToArray() }; - var json = JsonSerializer.Serialize(requestBody, SynonymSerializerContext.Default.SynonymSetRequest); + var synonymRules = _synonyms.Aggregate(new List(), (acc, synonym) => + { + acc.Add(new SynonymRule + { + Id = synonym.Split(",", StringSplitOptions.RemoveEmptyEntries)[0].Trim(), + Synonyms = synonym + }); + return acc; + }); + + var synonymsSet = new SynonymsSet + { + Synonyms = synonymRules + }; + + var json = JsonSerializer.Serialize(synonymsSet, SynonymSerializerContext.Default.SynonymsSet); var response = await _transport.PutAsync($"_synonyms/{setName}", PostData.String(json), ctx); @@ -456,3 +471,15 @@ public void Dispose() GC.SuppressFinalize(this); } } + +internal sealed record SynonymsSet +{ + [JsonPropertyName("synonyms_set")] + public required List Synonyms { get; init; } = []; +} + +internal sealed record SynonymRule +{ + public required string Id { get; init; } + public required string Synonyms { get; init; } +} From ed068e27b18c5c4087ee2c9d13cbb443db951f09 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Thu, 23 Oct 2025 12:22:10 +0200 Subject: [PATCH 2/4] Cleanup --- .../ElasticsearchMarkdownExporter.cs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs index 9b754761e..807452e27 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs @@ -25,17 +25,6 @@ namespace Elastic.Markdown.Exporters.Elasticsearch; [EnumExtensions] public enum IngestStrategy { Reindex, Multiplex } -internal sealed record SynonymSetRequest -{ - [JsonPropertyName("synonyms")] - public required string[] Synonyms { get; init; } -} - -[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower)] -[JsonSerializable(typeof(SynonymsSet))] -[JsonSerializable(typeof(SynonymRule))] -internal sealed partial class SynonymSerializerContext : JsonSerializerContext { }; - public class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposable { private readonly IDiagnosticsCollector _collector; @@ -483,3 +472,8 @@ internal sealed record SynonymRule public required string Id { get; init; } public required string Synonyms { get; init; } } + +[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower)] +[JsonSerializable(typeof(SynonymsSet))] +[JsonSerializable(typeof(SynonymRule))] +internal sealed partial class SynonymSerializerContext : JsonSerializerContext; From 36ad2a9968f051c1c753b760a375bdebf961dc98 Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Thu, 23 Oct 2025 12:30:25 +0200 Subject: [PATCH 3/4] Add indexNamespace to synonyms --- .../Exporters/Elasticsearch/ElasticsearchExporter.cs | 2 +- .../Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs index cf94aabd1..afdd99498 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs @@ -33,7 +33,7 @@ DistributedTransport transport { "batch_index_date", d.BatchIndexDate.ToString("o") } }), GetMapping = () => CreateMapping(null), - GetMappingSettings = () => CreateMappingSetting("docs"), + GetMappingSettings = () => CreateMappingSetting($"docs-{indexNamespace}"), IndexFormat = $"{endpoint.IndexNamePrefix.Replace("semantic", "lexical").ToLowerInvariant()}-{indexNamespace.ToLowerInvariant()}-{{0:yyyy.MM.dd.HHmmss}}", ActiveSearchAlias = $"{endpoint.IndexNamePrefix.Replace("semantic", "lexical").ToLowerInvariant()}-{indexNamespace.ToLowerInvariant()}" diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs index 807452e27..193ecaa41 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs @@ -37,6 +37,7 @@ public class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposable private readonly DateTimeOffset _batchIndexDate = DateTimeOffset.UtcNow; private readonly DistributedTransport _transport; private IngestStrategy _indexStrategy; + private string _indexNamespace; private string _currentLexicalHash = string.Empty; private string _currentSemanticHash = string.Empty; @@ -54,7 +55,7 @@ SynonymsConfiguration synonyms _logger = logFactory.CreateLogger(); _endpoint = endpoints.Elasticsearch; _indexStrategy = IngestStrategy.Reindex; - + _indexNamespace = indexNamespace; var es = endpoints.Elasticsearch; var configuration = new ElasticsearchConfiguration(es.Uri) @@ -92,7 +93,7 @@ public async ValueTask StartAsync(Cancel ctx = default) _currentLexicalHash = await _lexicalChannel.Channel.GetIndexTemplateHashAsync(ctx) ?? string.Empty; _currentSemanticHash = await _semanticChannel.Channel.GetIndexTemplateHashAsync(ctx) ?? string.Empty; - await PublishSynonymsAsync("docs", ctx); + await PublishSynonymsAsync($"docs-{_indexNamespace}", ctx); _ = await _lexicalChannel.Channel.BootstrapElasticsearchAsync(BootstrapMethod.Failure, null, ctx); // if the previous hash does not match the current hash, we know already we want to multiplex to a new index From 252c851d308d13393f571f0b354bb4b62d49d50a Mon Sep 17 00:00:00 2001 From: Jan Calanog Date: Thu, 23 Oct 2025 12:30:46 +0200 Subject: [PATCH 4/4] Fix --- .../Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs index 193ecaa41..c26f9f2da 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs @@ -37,7 +37,7 @@ public class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposable private readonly DateTimeOffset _batchIndexDate = DateTimeOffset.UtcNow; private readonly DistributedTransport _transport; private IngestStrategy _indexStrategy; - private string _indexNamespace; + private readonly string _indexNamespace; private string _currentLexicalHash = string.Empty; private string _currentSemanticHash = string.Empty;