Skip to content

Commit

Permalink
support predicate_token_filter elastic/elasticsearch#33431 (#3522)
Browse files Browse the repository at this point in the history
* support predicate_token_filter elastic/elasticsearch#33431

* add new file

* fix failing unit tests
  • Loading branch information
Mpdreamz committed Jan 25, 2019
1 parent 3e60dab commit 6d9fa3a
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 0 deletions.
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

0 comments on commit 6d9fa3a

Please sign in to comment.