Skip to content

Commit 6d5340b

Browse files
committed
support predicate_token_filter elastic/elasticsearch#33431 (#3522)
* support predicate_token_filter elastic/elasticsearch#33431 * add new file * fix failing unit tests
1 parent 13c6a80 commit 6d5340b

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Nest
5+
{
6+
/// <summary>
7+
/// The predicate_token_filter token filter takes a predicate script, and removes tokens that do
8+
/// not match the predicate.
9+
/// </summary>
10+
public interface IPredicateTokenFilter : ITokenFilter
11+
{
12+
/// <summary>
13+
/// a predicate script that determines whether or not the current token will
14+
/// be emitted. Note that only inline scripts are supported.
15+
/// </summary>
16+
[JsonProperty("script")]
17+
IScript Script { get; set; }
18+
}
19+
20+
public class PredicateTokenFilter : TokenFilterBase, IPredicateTokenFilter
21+
{
22+
public PredicateTokenFilter() : base("predicate_token_filter") { }
23+
24+
public IScript Script { get; set; }
25+
}
26+
27+
/// <inheritdoc cref="IPredicateTokenFilter" />
28+
public class PredicateTokenFilterDescriptor
29+
: TokenFilterDescriptorBase<PredicateTokenFilterDescriptor, IPredicateTokenFilter>, IPredicateTokenFilter
30+
{
31+
protected override string Type => "predicate_token_filter";
32+
33+
IScript IPredicateTokenFilter.Script { get; set; }
34+
35+
/// <inheritdoc cref="IPredicateTokenFilter.Script" />
36+
public PredicateTokenFilterDescriptor Script(Func<ScriptDescriptor, IScript> scriptSelector) =>
37+
Assign(a => a.Script = scriptSelector?.Invoke(new ScriptDescriptor()));
38+
39+
/// <inheritdoc cref="IPredicateTokenFilter.Script" />
40+
public PredicateTokenFilterDescriptor Script(string predicate) =>
41+
Assign(a => a.Script = new InlineScript(predicate));
42+
}
43+
}

src/Nest/Analysis/TokenFilters/TokenFilters.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ public TokenFiltersDescriptor Standard(string name, Func<StandardTokenFilterDesc
225225
public TokenFiltersDescriptor Stemmer(string name, Func<StemmerTokenFilterDescriptor, IStemmerTokenFilter> selector) =>
226226
Assign(name, selector?.Invoke(new StemmerTokenFilterDescriptor()));
227227

228+
/// <inheritdoc cref="IPredicateTokenFilter" />
229+
public TokenFiltersDescriptor Predicate(string name, Func<PredicateTokenFilterDescriptor, IPredicateTokenFilter> selector) =>
230+
Assign(name, selector?.Invoke(new PredicateTokenFilterDescriptor()));
231+
228232
/// <inheritdoc cref="IConditionTokenFilter" />
229233
public TokenFiltersDescriptor Condition(string name, Func<ConditionTokenFilterDescriptor, IConditionTokenFilter> selector) =>
230234
Assign(name, selector?.Invoke(new ConditionTokenFilterDescriptor()));

src/Nest/Indices/Analyze/AnalyzeTokenFilters.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ public AnalyzeTokenFiltersDescriptor Condition(Func<ConditionTokenFilterDescript
251251
public AnalyzeTokenFiltersDescriptor Stemmer(Func<StemmerTokenFilterDescriptor, IStemmerTokenFilter> selector) =>
252252
AssignIfNotNull(selector?.Invoke(new StemmerTokenFilterDescriptor()));
253253

254+
/// <inheritdoc cref="IPredicateTokenFilter" />
255+
public AnalyzeTokenFiltersDescriptor Predicate(Func<PredicateTokenFilterDescriptor, IPredicateTokenFilter> selector) =>
256+
AssignIfNotNull(selector?.Invoke(new PredicateTokenFilterDescriptor()));
257+
254258
/// <summary>
255259
/// Overrides stemming algorithms, by applying a custom mapping, then protecting these terms from being modified by stemmers. Must be placed
256260
/// before any stemming filters.

src/Tests/Tests/Analysis/TokenFilters/TokenFilterTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,28 @@ public class StemmerTests : TokenFilterAssertionBase<StemmerTests>
584584
public override string Name => "stem";
585585
}
586586

587+
[SkipVersion("<6.5.0", "predicate token filter not available in earlier versions")]
588+
public class PredicateTests : TokenFilterAssertionBase<PredicateTests>
589+
{
590+
private readonly string _predicate = "token.getTerm().length() > 5";
591+
592+
public override FuncTokenFilters Fluent => (n, tf) => tf.Predicate(n, t => t.Script(_predicate));
593+
594+
public override ITokenFilter Initializer => new PredicateTokenFilter { Script = new InlineScript(_predicate) };
595+
596+
public override object Json => new
597+
{
598+
type = "predicate_token_filter",
599+
script = new
600+
{
601+
source = _predicate
602+
}
603+
};
604+
605+
public override string Name => "predicate";
606+
}
607+
608+
587609
public class StemmerOverrideTests : TokenFilterAssertionBase<StemmerOverrideTests>
588610
{
589611
public override FuncTokenFilters Fluent => (n, tf) => tf.StemmerOverride(n, t => t.RulesPath("analysis/custom_stems.txt"));

0 commit comments

Comments
 (0)