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);