Skip to content

Commit 0a53096

Browse files
authored
Add updateable property to Synonym token filters (#4257)
This commit adds the updateable property to the Synonym and SynonymGraph token filters. Closes #4252
1 parent 9fab17e commit 0a53096

File tree

3 files changed

+104
-17
lines changed

3 files changed

+104
-17
lines changed

src/Nest/Analysis/TokenFilters/Synonym/SynonymGraphTokenFilter.cs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ public interface ISynonymGraphTokenFilter : ITokenFilter
3333

3434
[DataMember(Name ="tokenizer")]
3535
string Tokenizer { get; set; }
36+
37+
/// <summary>
38+
/// Whether this token filter can reload changes to synonym files
39+
/// on demand.
40+
/// Marking as updateable means this component is only usable at search time
41+
/// </summary>
42+
/// <remarks>
43+
/// Supported in Elasticsearch 7.3.0+
44+
/// </remarks>
45+
[DataMember(Name = "updateable")]
46+
[JsonFormatter(typeof(NullableStringBooleanFormatter))]
47+
bool? Updateable { get; set; }
3648
}
3749

3850
/// <inheritdoc />
@@ -57,6 +69,9 @@ public SynonymGraphTokenFilter() : base("synonym_graph") { }
5769

5870
/// <inheritdoc />
5971
public string Tokenizer { get; set; }
72+
73+
/// <inheritdoc />
74+
public bool? Updateable { get; set; }
6075
}
6176

6277
/// <inheritdoc />
@@ -66,33 +81,34 @@ public class SynonymGraphTokenFilterDescriptor
6681
protected override string Type => "synonym_graph";
6782
bool? ISynonymGraphTokenFilter.Expand { get; set; }
6883
SynonymFormat? ISynonymGraphTokenFilter.Format { get; set; }
69-
7084
bool? ISynonymGraphTokenFilter.Lenient { get; set; }
71-
7285
IEnumerable<string> ISynonymGraphTokenFilter.Synonyms { get; set; }
7386
string ISynonymGraphTokenFilter.SynonymsPath { get; set; }
7487
string ISynonymGraphTokenFilter.Tokenizer { get; set; }
88+
bool? ISynonymGraphTokenFilter.Updateable { get; set; }
7589

76-
/// <inheritdoc />
90+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Expand"/>
7791
public SynonymGraphTokenFilterDescriptor Expand(bool? expand = true) => Assign(expand, (a, v) => a.Expand = v);
7892

79-
/// <inheritdoc cref="ISynonymTokenFilter.Lenient" />
93+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Lenient" />
8094
public SynonymGraphTokenFilterDescriptor Lenient(bool? lenient = true) => Assign(lenient, (a, v) => a.Lenient = v);
8195

82-
83-
/// <inheritdoc />
96+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Tokenizer"/>
8497
public SynonymGraphTokenFilterDescriptor Tokenizer(string tokenizer) => Assign(tokenizer, (a, v) => a.Tokenizer = v);
8598

86-
/// <inheritdoc />
99+
/// <inheritdoc cref="ISynonymGraphTokenFilter.SynonymsPath"/>
87100
public SynonymGraphTokenFilterDescriptor SynonymsPath(string path) => Assign(path, (a, v) => a.SynonymsPath = v);
88101

89-
/// <inheritdoc />
102+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Format"/>
90103
public SynonymGraphTokenFilterDescriptor Format(SynonymFormat? format) => Assign(format, (a, v) => a.Format = v);
91104

92-
/// <inheritdoc />
105+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Synonyms"/>
93106
public SynonymGraphTokenFilterDescriptor Synonyms(IEnumerable<string> synonymGraphs) => Assign(synonymGraphs, (a, v) => a.Synonyms = v);
94107

95-
/// <inheritdoc />
108+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Synonyms"/>
96109
public SynonymGraphTokenFilterDescriptor Synonyms(params string[] synonymGraphs) => Assign(synonymGraphs, (a, v) => a.Synonyms = v);
110+
111+
/// <inheritdoc cref="ISynonymGraphTokenFilter.Updateable"/>
112+
public SynonymGraphTokenFilterDescriptor Updateable(bool? updateable = true) => Assign(updateable, (a, v) => a.Updateable = v);
97113
}
98114
}

src/Nest/Analysis/TokenFilters/Synonym/SynonymTokenFilter.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ public interface ISynonymTokenFilter : ITokenFilter
3535

3636
[DataMember(Name ="tokenizer")]
3737
string Tokenizer { get; set; }
38+
39+
/// <summary>
40+
/// Whether this token filter can reload changes to synonym files
41+
/// on demand.
42+
/// Marking as updateable means this component is only usable at search time
43+
/// </summary>
44+
/// <remarks>
45+
/// Supported in Elasticsearch 7.3.0+
46+
/// </remarks>
47+
[DataMember(Name = "updateable")]
48+
[JsonFormatter(typeof(NullableStringBooleanFormatter))]
49+
bool? Updateable { get; set; }
3850
}
3951

4052
/// <inheritdoc />
@@ -59,6 +71,9 @@ public SynonymTokenFilter() : base("synonym") { }
5971

6072
/// <inheritdoc />
6173
public string Tokenizer { get; set; }
74+
75+
/// <inheritdoc />
76+
public bool? Updateable { get; set; }
6277
}
6378

6479
/// <inheritdoc />
@@ -72,26 +87,30 @@ public class SynonymTokenFilterDescriptor
7287
IEnumerable<string> ISynonymTokenFilter.Synonyms { get; set; }
7388
string ISynonymTokenFilter.SynonymsPath { get; set; }
7489
string ISynonymTokenFilter.Tokenizer { get; set; }
90+
bool? ISynonymTokenFilter.Updateable { get; set; }
7591

76-
/// <inheritdoc />
92+
/// <inheritdoc cref="ISynonymTokenFilter.Expand"/>
7793
public SynonymTokenFilterDescriptor Expand(bool? expand = true) => Assign(expand, (a, v) => a.Expand = v);
7894

7995
/// <inheritdoc cref="ISynonymTokenFilter.Lenient" />
8096
public SynonymTokenFilterDescriptor Lenient(bool? lenient = true) => Assign(lenient, (a, v) => a.Lenient = v);
8197

82-
/// <inheritdoc />
98+
/// <inheritdoc cref="ISynonymTokenFilter.Tokenizer"/>
8399
public SynonymTokenFilterDescriptor Tokenizer(string tokenizer) => Assign(tokenizer, (a, v) => a.Tokenizer = v);
84100

85-
/// <inheritdoc />
101+
/// <inheritdoc cref="ISynonymTokenFilter.SynonymsPath"/>
86102
public SynonymTokenFilterDescriptor SynonymsPath(string path) => Assign(path, (a, v) => a.SynonymsPath = v);
87103

88-
/// <inheritdoc />
104+
/// <inheritdoc cref="ISynonymTokenFilter.Format"/>
89105
public SynonymTokenFilterDescriptor Format(SynonymFormat? format) => Assign(format, (a, v) => a.Format = v);
90106

91-
/// <inheritdoc />
107+
/// <inheritdoc cref="ISynonymTokenFilter.Synonyms"/>
92108
public SynonymTokenFilterDescriptor Synonyms(IEnumerable<string> synonyms) => Assign(synonyms, (a, v) => a.Synonyms = v);
93109

94-
/// <inheritdoc />
110+
/// <inheritdoc cref="ISynonymTokenFilter.Synonyms"/>
95111
public SynonymTokenFilterDescriptor Synonyms(params string[] synonyms) => Assign(synonyms, (a, v) => a.Synonyms = v);
112+
113+
/// <inheritdoc cref="ISynonymTokenFilter.Updateable"/>
114+
public SynonymTokenFilterDescriptor Updateable(bool? updateable = true) => Assign(updateable, (a, v) => a.Updateable = v);
96115
}
97116
}

src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ public class SynonymTests : TokenFilterAssertionBase<SynonymTests>
689689
}
690690

691691
[SkipVersion("<6.4.0", "Lenient is an option introduced in 6.4.0")]
692-
public class SynonymLenientTests : TokenFilterAssertionBase<SynonymTests>
692+
public class SynonymLenientTests : TokenFilterAssertionBase<SynonymLenientTests>
693693
{
694694
private readonly string[] _synonyms = { "foo", "bar => baz" };
695695

@@ -716,6 +716,32 @@ public class SynonymLenientTests : TokenFilterAssertionBase<SynonymTests>
716716
public override string Name => "syn_lenient";
717717
}
718718

719+
[SkipVersion("<7.3.0", "updateable introduced in 7.3.0")]
720+
public class SynonymUpdateableTests : TokenFilterAssertionBase<SynonymTests>
721+
{
722+
public override FuncTokenFilters Fluent => (n, tf) => tf
723+
.Synonym(n, t => t
724+
.SynonymsPath("analysis/stopwords.txt")
725+
.Updateable()
726+
);
727+
728+
public override ITokenFilter Initializer =>
729+
new SynonymTokenFilter
730+
{
731+
SynonymsPath = "analysis/stopwords.txt",
732+
Updateable = true
733+
};
734+
735+
public override object Json => new
736+
{
737+
type = "synonym",
738+
synonyms_path = "analysis/stopwords.txt",
739+
updateable = true
740+
};
741+
742+
public override string Name => "syn_updateable";
743+
}
744+
719745
public class SynonymGraphTests : TokenFilterAssertionBase<SynonymGraphTests>
720746
{
721747
public override FuncTokenFilters Fluent => (n, tf) => tf
@@ -750,6 +776,32 @@ public class SynonymGraphTests : TokenFilterAssertionBase<SynonymGraphTests>
750776
public override string Name => "syn_graph";
751777
}
752778

779+
[SkipVersion("<7.3.0", "updateable introduced in 7.3.0")]
780+
public class SynonymGraphUpdateableTests : TokenFilterAssertionBase<SynonymGraphUpdateableTests>
781+
{
782+
public override FuncTokenFilters Fluent => (n, tf) => tf
783+
.SynonymGraph(n, t => t
784+
.SynonymsPath("analysis/stopwords.txt")
785+
.Updateable()
786+
);
787+
788+
public override ITokenFilter Initializer =>
789+
new SynonymGraphTokenFilter
790+
{
791+
SynonymsPath = "analysis/stopwords.txt",
792+
Updateable = true
793+
};
794+
795+
public override object Json => new
796+
{
797+
type = "synonym_graph",
798+
synonyms_path = "analysis/stopwords.txt",
799+
updateable = true,
800+
};
801+
802+
public override string Name => "syn_graph_updateable";
803+
}
804+
753805
public class TrimTests : TokenFilterAssertionBase<TrimTests>
754806
{
755807
public override FuncTokenFilters Fluent => (n, tf) => tf.Trim(n);

0 commit comments

Comments
 (0)