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"));