diff --git a/src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs b/src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs new file mode 100644 index 00000000000..4f7f18a4fa7 --- /dev/null +++ b/src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs @@ -0,0 +1,43 @@ +using System; +using Newtonsoft.Json; + +namespace Nest +{ + /// + /// The predicate_token_filter token filter takes a predicate script, and removes tokens that do + /// not match the predicate. + /// + public interface IPredicateTokenFilter : ITokenFilter + { + /// + /// a predicate script that determines whether or not the current token will + /// be emitted. Note that only inline scripts are supported. + /// + [JsonProperty("script")] + IScript Script { get; set; } + } + + public class PredicateTokenFilter : TokenFilterBase, IPredicateTokenFilter + { + public PredicateTokenFilter() : base("predicate_token_filter") { } + + public IScript Script { get; set; } + } + + /// + public class PredicateTokenFilterDescriptor + : TokenFilterDescriptorBase, IPredicateTokenFilter + { + protected override string Type => "predicate_token_filter"; + + IScript IPredicateTokenFilter.Script { get; set; } + + /// + public PredicateTokenFilterDescriptor Script(Func scriptSelector) => + Assign(a => a.Script = scriptSelector?.Invoke(new ScriptDescriptor())); + + /// + public PredicateTokenFilterDescriptor Script(string predicate) => + Assign(a => a.Script = new InlineScript(predicate)); + } +} diff --git a/src/Nest/Analysis/TokenFilters/TokenFilters.cs b/src/Nest/Analysis/TokenFilters/TokenFilters.cs index c223e7dafd9..a1396926310 100644 --- a/src/Nest/Analysis/TokenFilters/TokenFilters.cs +++ b/src/Nest/Analysis/TokenFilters/TokenFilters.cs @@ -225,6 +225,10 @@ public TokenFiltersDescriptor Standard(string name, Func selector) => Assign(name, selector?.Invoke(new StemmerTokenFilterDescriptor())); + /// + public TokenFiltersDescriptor Predicate(string name, Func selector) => + Assign(name, selector?.Invoke(new PredicateTokenFilterDescriptor())); + /// public TokenFiltersDescriptor Condition(string name, Func selector) => Assign(name, selector?.Invoke(new ConditionTokenFilterDescriptor())); diff --git a/src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs b/src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs index b6699b71481..8917fee5e54 100644 --- a/src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs +++ b/src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs @@ -251,6 +251,10 @@ public AnalyzeTokenFiltersDescriptor Condition(Func selector) => AssignIfNotNull(selector?.Invoke(new StemmerTokenFilterDescriptor())); + /// + public AnalyzeTokenFiltersDescriptor Predicate(Func selector) => + AssignIfNotNull(selector?.Invoke(new PredicateTokenFilterDescriptor())); + /// /// Overrides stemming algorithms, by applying a custom mapping, then protecting these terms from being modified by stemmers. Must be placed /// before any stemming filters. diff --git a/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs b/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs index b64c9c60de0..0794bbe035e 100644 --- a/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs +++ b/src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs @@ -584,6 +584,28 @@ public class StemmerTests : TokenFilterAssertionBase public override string Name => "stem"; } + [SkipVersion("<6.5.0", "predicate token filter not available in earlier versions")] + public class PredicateTests : TokenFilterAssertionBase + { + private readonly string _predicate = "token.getTerm().length() > 5"; + + public override FuncTokenFilters Fluent => (n, tf) => tf.Predicate(n, t => t.Script(_predicate)); + + public override ITokenFilter Initializer => new PredicateTokenFilter { Script = new InlineScript(_predicate) }; + + public override object Json => new + { + type = "predicate_token_filter", + script = new + { + source = _predicate + } + }; + + public override string Name => "predicate"; + } + + public class StemmerOverrideTests : TokenFilterAssertionBase { public override FuncTokenFilters Fluent => (n, tf) => tf.StemmerOverride(n, t => t.RulesPath("analysis/custom_stems.txt"));