Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using System;
using Newtonsoft.Json;

namespace Nest
{
/// <summary>
/// The predicate_token_filter token filter takes a predicate script, and removes tokens that do
/// not match the predicate.
/// </summary>
public interface IPredicateTokenFilter : ITokenFilter
{
/// <summary>
/// a predicate script that determines whether or not the current token will
/// be emitted. Note that only inline scripts are supported.
/// </summary>
[JsonProperty("script")]
IScript Script { get; set; }
}

public class PredicateTokenFilter : TokenFilterBase, IPredicateTokenFilter
{
public PredicateTokenFilter() : base("predicate_token_filter") { }

public IScript Script { get; set; }
}

/// <inheritdoc cref="IPredicateTokenFilter" />
public class PredicateTokenFilterDescriptor
: TokenFilterDescriptorBase<PredicateTokenFilterDescriptor, IPredicateTokenFilter>, IPredicateTokenFilter
{
protected override string Type => "predicate_token_filter";

IScript IPredicateTokenFilter.Script { get; set; }

/// <inheritdoc cref="IPredicateTokenFilter.Script" />
public PredicateTokenFilterDescriptor Script(Func<ScriptDescriptor, IScript> scriptSelector) =>
Assign(a => a.Script = scriptSelector?.Invoke(new ScriptDescriptor()));

/// <inheritdoc cref="IPredicateTokenFilter.Script" />
public PredicateTokenFilterDescriptor Script(string predicate) =>
Assign(a => a.Script = new InlineScript(predicate));
}
}
4 changes: 4 additions & 0 deletions src/Nest/Analysis/TokenFilters/TokenFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,10 @@ public TokenFiltersDescriptor Standard(string name, Func<StandardTokenFilterDesc
public TokenFiltersDescriptor Stemmer(string name, Func<StemmerTokenFilterDescriptor, IStemmerTokenFilter> selector) =>
Assign(name, selector?.Invoke(new StemmerTokenFilterDescriptor()));

/// <inheritdoc cref="IPredicateTokenFilter" />
public TokenFiltersDescriptor Predicate(string name, Func<PredicateTokenFilterDescriptor, IPredicateTokenFilter> selector) =>
Assign(name, selector?.Invoke(new PredicateTokenFilterDescriptor()));

/// <inheritdoc cref="IConditionTokenFilter" />
public TokenFiltersDescriptor Condition(string name, Func<ConditionTokenFilterDescriptor, IConditionTokenFilter> selector) =>
Assign(name, selector?.Invoke(new ConditionTokenFilterDescriptor()));
Expand Down
4 changes: 4 additions & 0 deletions src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,10 @@ public AnalyzeTokenFiltersDescriptor Condition(Func<ConditionTokenFilterDescript
public AnalyzeTokenFiltersDescriptor Stemmer(Func<StemmerTokenFilterDescriptor, IStemmerTokenFilter> selector) =>
AssignIfNotNull(selector?.Invoke(new StemmerTokenFilterDescriptor()));

/// <inheritdoc cref="IPredicateTokenFilter" />
public AnalyzeTokenFiltersDescriptor Predicate(Func<PredicateTokenFilterDescriptor, IPredicateTokenFilter> selector) =>
AssignIfNotNull(selector?.Invoke(new PredicateTokenFilterDescriptor()));

/// <summary>
/// Overrides stemming algorithms, by applying a custom mapping, then protecting these terms from being modified by stemmers. Must be placed
/// before any stemming filters.
Expand Down
22 changes: 22 additions & 0 deletions src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,28 @@ public class StemmerTests : TokenFilterAssertionBase<StemmerTests>
public override string Name => "stem";
}

[SkipVersion("<6.5.0", "predicate token filter not available in earlier versions")]
public class PredicateTests : TokenFilterAssertionBase<PredicateTests>
{
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<StemmerOverrideTests>
{
public override FuncTokenFilters Fluent => (n, tf) => tf.StemmerOverride(n, t => t.RulesPath("analysis/custom_stems.txt"));
Expand Down