diff --git a/src/Nest/Analysis/TokenFilters/Synonym/SynonymGraphTokenFilter.cs b/src/Nest/Analysis/TokenFilters/Synonym/SynonymGraphTokenFilter.cs index 694491312d5..a726808c424 100644 --- a/src/Nest/Analysis/TokenFilters/Synonym/SynonymGraphTokenFilter.cs +++ b/src/Nest/Analysis/TokenFilters/Synonym/SynonymGraphTokenFilter.cs @@ -33,6 +33,18 @@ public interface ISynonymGraphTokenFilter : ITokenFilter [DataMember(Name ="tokenizer")] string Tokenizer { get; set; } + + /// + /// Whether this token filter can reload changes to synonym files + /// on demand. + /// Marking as updateable means this component is only usable at search time + /// + /// + /// Supported in Elasticsearch 7.3.0+ + /// + [DataMember(Name = "updateable")] + [JsonFormatter(typeof(NullableStringBooleanFormatter))] + bool? Updateable { get; set; } } /// @@ -57,6 +69,9 @@ public SynonymGraphTokenFilter() : base("synonym_graph") { } /// public string Tokenizer { get; set; } + + /// + public bool? Updateable { get; set; } } /// @@ -66,33 +81,34 @@ public class SynonymGraphTokenFilterDescriptor protected override string Type => "synonym_graph"; bool? ISynonymGraphTokenFilter.Expand { get; set; } SynonymFormat? ISynonymGraphTokenFilter.Format { get; set; } - bool? ISynonymGraphTokenFilter.Lenient { get; set; } - IEnumerable ISynonymGraphTokenFilter.Synonyms { get; set; } string ISynonymGraphTokenFilter.SynonymsPath { get; set; } string ISynonymGraphTokenFilter.Tokenizer { get; set; } + bool? ISynonymGraphTokenFilter.Updateable { get; set; } - /// + /// public SynonymGraphTokenFilterDescriptor Expand(bool? expand = true) => Assign(expand, (a, v) => a.Expand = v); - /// + /// public SynonymGraphTokenFilterDescriptor Lenient(bool? lenient = true) => Assign(lenient, (a, v) => a.Lenient = v); - - /// + /// public SynonymGraphTokenFilterDescriptor Tokenizer(string tokenizer) => Assign(tokenizer, (a, v) => a.Tokenizer = v); - /// + /// public SynonymGraphTokenFilterDescriptor SynonymsPath(string path) => Assign(path, (a, v) => a.SynonymsPath = v); - /// + /// public SynonymGraphTokenFilterDescriptor Format(SynonymFormat? format) => Assign(format, (a, v) => a.Format = v); - /// + /// public SynonymGraphTokenFilterDescriptor Synonyms(IEnumerable synonymGraphs) => Assign(synonymGraphs, (a, v) => a.Synonyms = v); - /// + /// public SynonymGraphTokenFilterDescriptor Synonyms(params string[] synonymGraphs) => Assign(synonymGraphs, (a, v) => a.Synonyms = v); + + /// + public SynonymGraphTokenFilterDescriptor Updateable(bool? updateable = true) => Assign(updateable, (a, v) => a.Updateable = v); } } diff --git a/src/Nest/Analysis/TokenFilters/Synonym/SynonymTokenFilter.cs b/src/Nest/Analysis/TokenFilters/Synonym/SynonymTokenFilter.cs index 50d79de2f44..581e9afa4be 100644 --- a/src/Nest/Analysis/TokenFilters/Synonym/SynonymTokenFilter.cs +++ b/src/Nest/Analysis/TokenFilters/Synonym/SynonymTokenFilter.cs @@ -35,6 +35,18 @@ public interface ISynonymTokenFilter : ITokenFilter [DataMember(Name ="tokenizer")] string Tokenizer { get; set; } + + /// + /// Whether this token filter can reload changes to synonym files + /// on demand. + /// Marking as updateable means this component is only usable at search time + /// + /// + /// Supported in Elasticsearch 7.3.0+ + /// + [DataMember(Name = "updateable")] + [JsonFormatter(typeof(NullableStringBooleanFormatter))] + bool? Updateable { get; set; } } /// @@ -59,6 +71,9 @@ public SynonymTokenFilter() : base("synonym") { } /// public string Tokenizer { get; set; } + + /// + public bool? Updateable { get; set; } } /// @@ -72,26 +87,30 @@ public class SynonymTokenFilterDescriptor IEnumerable ISynonymTokenFilter.Synonyms { get; set; } string ISynonymTokenFilter.SynonymsPath { get; set; } string ISynonymTokenFilter.Tokenizer { get; set; } + bool? ISynonymTokenFilter.Updateable { get; set; } - /// + /// public SynonymTokenFilterDescriptor Expand(bool? expand = true) => Assign(expand, (a, v) => a.Expand = v); /// public SynonymTokenFilterDescriptor Lenient(bool? lenient = true) => Assign(lenient, (a, v) => a.Lenient = v); - /// + /// public SynonymTokenFilterDescriptor Tokenizer(string tokenizer) => Assign(tokenizer, (a, v) => a.Tokenizer = v); - /// + /// public SynonymTokenFilterDescriptor SynonymsPath(string path) => Assign(path, (a, v) => a.SynonymsPath = v); - /// + /// public SynonymTokenFilterDescriptor Format(SynonymFormat? format) => Assign(format, (a, v) => a.Format = v); - /// + /// public SynonymTokenFilterDescriptor Synonyms(IEnumerable synonyms) => Assign(synonyms, (a, v) => a.Synonyms = v); - /// + /// public SynonymTokenFilterDescriptor Synonyms(params string[] synonyms) => Assign(synonyms, (a, v) => a.Synonyms = v); + + /// + public SynonymTokenFilterDescriptor Updateable(bool? updateable = true) => Assign(updateable, (a, v) => a.Updateable = v); } } diff --git a/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs b/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs index 50483d07e13..ed591c3a2cd 100644 --- a/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs +++ b/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs @@ -689,7 +689,7 @@ public class SynonymTests : TokenFilterAssertionBase } [SkipVersion("<6.4.0", "Lenient is an option introduced in 6.4.0")] - public class SynonymLenientTests : TokenFilterAssertionBase + public class SynonymLenientTests : TokenFilterAssertionBase { private readonly string[] _synonyms = { "foo", "bar => baz" }; @@ -716,6 +716,32 @@ public class SynonymLenientTests : TokenFilterAssertionBase public override string Name => "syn_lenient"; } + [SkipVersion("<7.3.0", "updateable introduced in 7.3.0")] + public class SynonymUpdateableTests : TokenFilterAssertionBase + { + public override FuncTokenFilters Fluent => (n, tf) => tf + .Synonym(n, t => t + .SynonymsPath("analysis/stopwords.txt") + .Updateable() + ); + + public override ITokenFilter Initializer => + new SynonymTokenFilter + { + SynonymsPath = "analysis/stopwords.txt", + Updateable = true + }; + + public override object Json => new + { + type = "synonym", + synonyms_path = "analysis/stopwords.txt", + updateable = true + }; + + public override string Name => "syn_updateable"; + } + public class SynonymGraphTests : TokenFilterAssertionBase { public override FuncTokenFilters Fluent => (n, tf) => tf @@ -750,6 +776,32 @@ public class SynonymGraphTests : TokenFilterAssertionBase public override string Name => "syn_graph"; } + [SkipVersion("<7.3.0", "updateable introduced in 7.3.0")] + public class SynonymGraphUpdateableTests : TokenFilterAssertionBase + { + public override FuncTokenFilters Fluent => (n, tf) => tf + .SynonymGraph(n, t => t + .SynonymsPath("analysis/stopwords.txt") + .Updateable() + ); + + public override ITokenFilter Initializer => + new SynonymGraphTokenFilter + { + SynonymsPath = "analysis/stopwords.txt", + Updateable = true + }; + + public override object Json => new + { + type = "synonym_graph", + synonyms_path = "analysis/stopwords.txt", + updateable = true, + }; + + public override string Name => "syn_graph_updateable"; + } + public class TrimTests : TokenFilterAssertionBase { public override FuncTokenFilters Fluent => (n, tf) => tf.Trim(n);