Skip to content

Commit 156d4bb

Browse files
Mpdreamzrusscam
authored andcommitted
Add Multiplexer Token Filter (#3425)
(cherry picked from commit ef88c30)
1 parent c3fa13d commit 156d4bb

File tree

4 files changed

+86
-1
lines changed

4 files changed

+86
-1
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
5+
namespace Nest
6+
{
7+
/// <summary>
8+
/// A token filter of type multiplexer will emit multiple tokens at the same position, each version of the token having
9+
/// been run through a different filter. Identical output tokens at the same position will be removed.
10+
/// </summary>
11+
public interface IMultiplexerTokenFilter : ITokenFilter
12+
{
13+
[JsonProperty("filters")]
14+
IEnumerable<string> Filters { get; set; }
15+
16+
[JsonProperty("preserve_original")]
17+
bool? PreserveOriginal { get; set; }
18+
}
19+
public class MultiplexerTokenFilter : TokenFilterBase, IMultiplexerTokenFilter
20+
{
21+
internal const string TokenType = "multiplexer";
22+
public MultiplexerTokenFilter() : base(TokenType) { }
23+
24+
/// <inheritdoc cref="IMultiplexerTokenFilter.Filters"/>
25+
public IEnumerable<string> Filters { get; set; }
26+
27+
/// <inheritdoc cref="IMultiplexerTokenFilter.PreserveOriginal"/>
28+
public bool? PreserveOriginal { get; set; }
29+
30+
}
31+
///<inheritdoc cref="IMultiplexerTokenFilter"/>
32+
public class MultiplexerTokenFilterDescriptor
33+
: TokenFilterDescriptorBase<MultiplexerTokenFilterDescriptor, IMultiplexerTokenFilter>, IMultiplexerTokenFilter
34+
{
35+
protected override string Type => MultiplexerTokenFilter.TokenType;
36+
37+
IEnumerable<string> IMultiplexerTokenFilter.Filters { get; set; }
38+
bool? IMultiplexerTokenFilter.PreserveOriginal { get; set; }
39+
40+
/// <inheritdoc cref="IMultiplexerTokenFilter.Filters"/>
41+
public MultiplexerTokenFilterDescriptor Filters(IEnumerable<string> filters) => Assign(a => a.Filters = filters);
42+
43+
/// <inheritdoc cref="IMultiplexerTokenFilter.Filters"/>
44+
public MultiplexerTokenFilterDescriptor Filters(params string[] filters) => Assign(a => a.Filters = filters);
45+
46+
/// <inheritdoc cref="IMultiplexerTokenFilter.PreserveOriginal"/>
47+
public MultiplexerTokenFilterDescriptor PreserveOriginal(bool? preserve = true) => Assign(a => a.PreserveOriginal = preserve);
48+
}
49+
50+
}

src/Nest/Analysis/TokenFilters/TokenFilters.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,5 +317,12 @@ public TokenFiltersDescriptor IcuNormalization(string name, Func<IcuNormalizatio
317317
/// </summary>
318318
public TokenFiltersDescriptor IcuTransform(string name, Func<IcuTransformTokenFilterDescriptor, IIcuTransformTokenFilter> selector) =>
319319
Assign(name, selector.Invoke(new IcuTransformTokenFilterDescriptor()));
320+
321+
/// <summary>
322+
/// A token filter of type multiplexer will emit multiple tokens at the same position, each version of the token
323+
/// having been run through a different filter. Identical output tokens at the same position will be removed.
324+
/// </summary>
325+
public TokenFiltersDescriptor Multiplexer(string name, Func<MultiplexerTokenFilterDescriptor, IMultiplexerTokenFilter> selector) =>
326+
Assign(name, selector.Invoke(new MultiplexerTokenFilterDescriptor()));
320327
}
321328
}

src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@ public AnalyzeTokenFiltersDescriptor IcuNormalization(Func<IcuNormalizationToken
323323
/// </summary>
324324
public AnalyzeTokenFiltersDescriptor IcuTransform(Func<IcuTransformTokenFilterDescriptor, IIcuTransformTokenFilter> selector) =>
325325
AssignIfNotNull(selector.Invoke(new IcuTransformTokenFilterDescriptor()));
326+
327+
///<inheritdoc cref="IMultiplexerTokenFilter"/>
328+
public AnalyzeTokenFiltersDescriptor Multiplexer(Func<MultiplexerTokenFilterDescriptor, IMultiplexerTokenFilter> selector) =>
329+
AssignIfNotNull(selector.Invoke(new MultiplexerTokenFilterDescriptor()));
326330
}
327331

328332
}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using System;
2+
using Elastic.Xunit.XunitPlumbing;
23
using Nest;
34
using Tests.Framework;
45

@@ -878,5 +879,28 @@ public class PhoneticTests : TokenFilterAssertionBase<PhoneticTests>
878879
};
879880

880881
}
882+
883+
[SkipVersion("<6.4.0", "Introduced in 6.4.0")]
884+
public class MultiplexerTests : TokenFilterAssertionBase<PhoneticTests>
885+
{
886+
public override string Name => "multiplexer";
887+
public override object Json => new
888+
{
889+
filters = new[]{"lowercase", "lowercase, porter_stem"},
890+
preserve_original = true
891+
};
892+
893+
public override ITokenFilter Initializer => new MultiplexerTokenFilter
894+
{
895+
Filters = new[] {"lowercase", "lowercase, porter_stem"},
896+
PreserveOriginal = true
897+
};
898+
899+
public override FuncTokenFilters Fluent => (n, tf) => tf
900+
.Multiplexer(n, t => t
901+
.Filters("lowercase", "lowercase, porter_stem")
902+
.PreserveOriginal()
903+
);
904+
}
881905
}
882906
}

0 commit comments

Comments
 (0)