Skip to content

Commit 5bdb99f

Browse files
committed
Support single or array of char filters and token filters (#3294)
Closes #3262 (cherry picked from commit 576882a)
1 parent 8bbd6fc commit 5bdb99f

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

src/Nest/Analysis/Analyzers/CustomAnalyzer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ public interface ICustomAnalyzer : IAnalyzer
1515
/// The logical / registered name of the tokenizer to use.
1616
/// </summary>
1717
[JsonProperty("char_filter")]
18+
[JsonConverter(typeof(ReadSingleOrEnumerableJsonConverter<string>))]
1819
IEnumerable<string> CharFilter { get; set; }
1920

2021
/// <summary>
2122
/// An optional list of logical / registered name of token filters.
2223
/// </summary>
2324
[JsonProperty("filter")]
25+
[JsonConverter(typeof(ReadSingleOrEnumerableJsonConverter<string>))]
2426
IEnumerable<string> Filter { get; set; }
2527

2628
/// <summary>

src/Nest/Analysis/Normalizers/CustomNormalizer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ public interface ICustomNormalizer : INormalizer
1717
/// Char filters to normalize the keyword
1818
/// </summary>
1919
[JsonProperty("char_filter")]
20+
[JsonConverter(typeof(ReadSingleOrEnumerableJsonConverter<string>))]
2021
IEnumerable<string> CharFilter { get; set; }
2122

2223
/// <summary>
2324
/// An optional list of logical / registered name of token filters.
2425
/// </summary>
2526
[JsonProperty("filter")]
27+
[JsonConverter(typeof(ReadSingleOrEnumerableJsonConverter<string>))]
2628
IEnumerable<string> Filter { get; set; }
2729
}
2830

src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/ReadSingleOrEnumerableJsonConverter.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
1616

1717
public override bool CanWrite => false;
1818

19-
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
20-
{
19+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) =>
2120
throw new NotSupportedException();
22-
}
2321
}
2422
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using System;
2+
using System.Text;
3+
using Elastic.Xunit.XunitPlumbing;
4+
using Elasticsearch.Net;
5+
using FluentAssertions;
6+
using Nest;
7+
using Tests.Framework;
8+
using Tests.Framework.ManagedElasticsearch.Clusters;
9+
10+
namespace Tests.Reproduce
11+
{
12+
public class GithubIssue3262
13+
{
14+
[U]
15+
public void CanDeserializeSingleFilterAndCharacterFilter()
16+
{
17+
var json = @"{
18+
""products_purchasing"": {
19+
""settings"": {
20+
""index"": {
21+
""number_of_shards"": ""5"",
22+
""provided_name"": ""products_purchasing"",
23+
""creation_date"": ""1510930394462"",
24+
""analysis"": {
25+
""normalizer"": {
26+
""lowercase"": {
27+
""filter"": ""lowercase"",
28+
""type"": ""custom"",
29+
""char_filter"": ""words""
30+
}
31+
},
32+
""analyzer"": {
33+
""whitespace_lowercase"": {
34+
""filter"": ""lowercase"",
35+
""type"": ""custom"",
36+
""tokenizer"": ""whitespace""
37+
},
38+
""keyword_lowercase"": {
39+
""filter"": ""lowercase"",
40+
""type"": ""custom"",
41+
""tokenizer"": ""keyword""
42+
}
43+
},
44+
""char_filter"": {
45+
""words"": {
46+
""pattern"": ""[(^([^A-Za-z\\s]*\\s)*|[^A-Za-z\\s])]"",
47+
""type"": ""pattern_replace"",
48+
""replacement"": """"
49+
}
50+
}
51+
},
52+
""number_of_replicas"": ""1"",
53+
""uuid"": ""peH2yqVLTIOc4ScTUYTtEA"",
54+
""version"": {
55+
""created"": ""5050099""
56+
}
57+
}
58+
}
59+
}
60+
}";
61+
62+
var bytes = Encoding.UTF8.GetBytes(json);
63+
64+
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
65+
var connectionSettings = new ConnectionSettings(pool, new InMemoryConnection(bytes));
66+
var client = new ElasticClient(connectionSettings);
67+
68+
Action getIndexRequest = () => client.GetIndex(new GetIndexRequest("products_purchasing"));
69+
70+
getIndexRequest.ShouldNotThrow();
71+
72+
var response = client.GetIndex(new GetIndexRequest("products_purchasing"));
73+
74+
var normalizer = response.Indices["products_purchasing"].Settings.Analysis.Normalizers["lowercase"] as ICustomNormalizer;
75+
normalizer.Should().NotBeNull();
76+
normalizer.Filter.Should().NotBeNull().And.HaveCount(1);
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)