Skip to content

Feature/multiplexing token filter #3425

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Oct 17, 2018
50 changes: 50 additions & 0 deletions src/Nest/Analysis/TokenFilters/MultiplexerTokenFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json;

namespace Nest
{
/// <summary>
/// A token filter of type multiplexer will emit multiple tokens at the same position, each version of the token having
/// been run through a different filter. Identical output tokens at the same position will be removed.
/// </summary>
public interface IMultiplexerTokenFilter : ITokenFilter
{
[JsonProperty("filters")]
IEnumerable<string> Filters { get; set; }

[JsonProperty("preserve_original")]
bool? PreserveOriginal { get; set; }
}
public class MultiplexerTokenFilter : TokenFilterBase, IMultiplexerTokenFilter
{
internal const string TokenType = "multiplexer";
public MultiplexerTokenFilter() : base(TokenType) { }

/// <inheritdoc cref="IMultiplexerTokenFilter.Filters"/>
public IEnumerable<string> Filters { get; set; }

/// <inheritdoc cref="IMultiplexerTokenFilter.PreserveOriginal"/>
public bool? PreserveOriginal { get; set; }

}
///<inheritdoc cref="IMultiplexerTokenFilter"/>
public class MultiplexerTokenFilterDescriptor
: TokenFilterDescriptorBase<MultiplexerTokenFilterDescriptor, IMultiplexerTokenFilter>, IMultiplexerTokenFilter
{
protected override string Type => MultiplexerTokenFilter.TokenType;

IEnumerable<string> IMultiplexerTokenFilter.Filters { get; set; }
bool? IMultiplexerTokenFilter.PreserveOriginal { get; set; }

/// <inheritdoc cref="IMultiplexerTokenFilter.Filters"/>
public MultiplexerTokenFilterDescriptor Filters(IEnumerable<string> filters) => Assign(a => a.Filters = filters);

/// <inheritdoc cref="IMultiplexerTokenFilter.Filters"/>
public MultiplexerTokenFilterDescriptor Filters(params string[] filters) => Assign(a => a.Filters = filters);

/// <inheritdoc cref="IMultiplexerTokenFilter.PreserveOriginal"/>
public MultiplexerTokenFilterDescriptor PreserveOriginal(bool? preserve = true) => Assign(a => a.PreserveOriginal = preserve);
}

}
7 changes: 7 additions & 0 deletions src/Nest/Analysis/TokenFilters/TokenFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -317,5 +317,12 @@ public TokenFiltersDescriptor IcuNormalization(string name, Func<IcuNormalizatio
/// </summary>
public TokenFiltersDescriptor IcuTransform(string name, Func<IcuTransformTokenFilterDescriptor, IIcuTransformTokenFilter> selector) =>
Assign(name, selector.Invoke(new IcuTransformTokenFilterDescriptor()));

/// <summary>
/// A token filter of type multiplexer will emit multiple tokens at the same position, each version of the token
/// having been run through a different filter. Identical output tokens at the same position will be removed.
/// </summary>
public TokenFiltersDescriptor Multiplexer(string name, Func<MultiplexerTokenFilterDescriptor, IMultiplexerTokenFilter> selector) =>
Assign(name, selector.Invoke(new MultiplexerTokenFilterDescriptor()));
}
}
4 changes: 4 additions & 0 deletions src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,10 @@ public AnalyzeTokenFiltersDescriptor IcuNormalization(Func<IcuNormalizationToken
/// </summary>
public AnalyzeTokenFiltersDescriptor IcuTransform(Func<IcuTransformTokenFilterDescriptor, IIcuTransformTokenFilter> selector) =>
AssignIfNotNull(selector.Invoke(new IcuTransformTokenFilterDescriptor()));

///<inheritdoc cref="IMultiplexerTokenFilter"/>
public AnalyzeTokenFiltersDescriptor Multiplexer(Func<MultiplexerTokenFilterDescriptor, IMultiplexerTokenFilter> selector) =>
AssignIfNotNull(selector.Invoke(new MultiplexerTokenFilterDescriptor()));
}

}
26 changes: 25 additions & 1 deletion src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System;
using Elastic.Xunit.XunitPlumbing;
using Nest;
using Tests.Framework;

Expand Down Expand Up @@ -878,5 +879,28 @@ public class PhoneticTests : TokenFilterAssertionBase<PhoneticTests>
};

}

[SkipVersion("<6.4.0", "Introduced in 6.4.0")]
public class MultiplexerTests : TokenFilterAssertionBase<PhoneticTests>
{
public override string Name => "multiplexer";
public override object Json => new
{
filters = new[]{"lowercase", "lowercase, porter_stem"},
preserve_original = true
};

public override ITokenFilter Initializer => new MultiplexerTokenFilter
{
Filters = new[] {"lowercase", "lowercase, porter_stem"},
PreserveOriginal = true
};

public override FuncTokenFilters Fluent => (n, tf) => tf
.Multiplexer(n, t => t
.Filters("lowercase", "lowercase, porter_stem")
.PreserveOriginal()
);
}
}
}