Skip to content

Commit 618dacd

Browse files
committed
Merge pull request #1897 from elastic/fix/1868
Fix #1868 add filter option to _termvectors and _mtermvectors
2 parents 7208634 + 72f1421 commit 618dacd

File tree

6 files changed

+116
-10
lines changed

6 files changed

+116
-10
lines changed

Diff for: src/Nest/Document/Multiple/MultiTermVectors/MultiTermVectorOperation.cs

+7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public interface IMultiTermVectorOperation
2525
bool? TermStatistics { get; set; }
2626
[JsonProperty("field_statistics")]
2727
bool? FieldStatistics { get; set; }
28+
[JsonProperty("filter")]
29+
ITermVectorFilter Filter { get; set; }
2830
}
2931

3032
public class MultiTermVectorOperation<T> : IMultiTermVectorOperation
@@ -47,6 +49,7 @@ public MultiTermVectorOperation(Id id)
4749
public bool? Positions { get; set; }
4850
public bool? TermStatistics { get; set; }
4951
public bool? FieldStatistics { get; set; }
52+
public ITermVectorFilter Filter { get; set; }
5053
}
5154

5255
public class MultiTermVectorOperationDescriptor<T> : DescriptorBase<MultiTermVectorOperationDescriptor<T>, IMultiTermVectorOperation>, IMultiTermVectorOperation
@@ -62,6 +65,7 @@ public class MultiTermVectorOperationDescriptor<T> : DescriptorBase<MultiTermVec
6265
bool? IMultiTermVectorOperation.Positions { get; set; }
6366
bool? IMultiTermVectorOperation.TermStatistics { get; set; }
6467
bool? IMultiTermVectorOperation.FieldStatistics { get; set; }
68+
ITermVectorFilter IMultiTermVectorOperation.Filter { get; set; }
6569

6670
public MultiTermVectorOperationDescriptor<T> Fields(Func<FieldsDescriptor<T>, IPromise<Fields>> fields) =>
6771
Assign(a => a.Fields = fields?.Invoke(new FieldsDescriptor<T>())?.Value);
@@ -77,5 +81,8 @@ public MultiTermVectorOperationDescriptor<T> Fields(Func<FieldsDescriptor<T>, IP
7781
public MultiTermVectorOperationDescriptor<T> TermStatistics(bool termStatistics = true) => Assign(a => a.TermStatistics = termStatistics);
7882

7983
public MultiTermVectorOperationDescriptor<T> FieldStatistics(bool fieldStatistics = true) => Assign(a => a.FieldStatistics = fieldStatistics);
84+
85+
public MultiTermVectorOperationDescriptor<T> Filter(Func<TermVectorFilterDescriptor, ITermVectorFilter> filterSelector) =>
86+
Assign(a => a.Filter = filterSelector?.Invoke(new TermVectorFilterDescriptor()));
8087
}
8188
}
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
5+
namespace Nest
6+
{
7+
[JsonObject(MemberSerialization.OptIn)]
8+
public interface ITermVectorFilter
9+
{
10+
[JsonProperty("max_num_terms")]
11+
int? MaximumNumberOfTerms { get; set; }
12+
13+
[JsonProperty("min_term_freq")]
14+
int? MinimumTermFrequency { get; set; }
15+
16+
[JsonProperty("min_doc_freq")]
17+
int? MinimumDocumentFrequency { get; set; }
18+
}
19+
20+
public class TermVectorFilter : ITermVectorFilter
21+
{
22+
public int? MaximumNumberOfTerms { get; set; }
23+
24+
public int? MinimumTermFrequency { get; set; }
25+
26+
public int? MinimumDocumentFrequency { get; set; }
27+
}
28+
29+
public class TermVectorFilterDescriptor
30+
: DescriptorBase<TermVectorFilterDescriptor, ITermVectorFilter>, ITermVectorFilter
31+
{
32+
int? ITermVectorFilter.MaximumNumberOfTerms { get; set; }
33+
34+
int? ITermVectorFilter.MinimumDocumentFrequency { get; set; }
35+
36+
int? ITermVectorFilter.MinimumTermFrequency { get; set; }
37+
38+
public TermVectorFilterDescriptor MaximimumNumberOfTerms(int maxNumTerms) => Assign(a => a.MaximumNumberOfTerms = maxNumTerms);
39+
40+
public TermVectorFilterDescriptor MinimumDocumentFrequency(int minDocFreq) => Assign(a => a.MinimumDocumentFrequency = minDocFreq);
41+
42+
public TermVectorFilterDescriptor MinimumTermFrequency(int minTermFreq) => Assign(a => a.MinimumTermFrequency = minTermFreq);
43+
}
44+
}

Diff for: src/Nest/Document/Single/TermVectors/TermVectorsRequest.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,22 @@ public partial interface ITermVectorsRequest<TDocument>
1616

1717
[JsonProperty("per_field_analyzer")]
1818
IPerFieldAnalyzer PerFieldAnalyzer { get; set; }
19+
20+
[JsonProperty("filter")]
21+
ITermVectorFilter Filter { get; set; }
1922
}
2023

2124
public partial class TermVectorsRequest<TDocument>
2225
where TDocument : class
2326
{
24-
HttpMethod IRequest.HttpMethod => this.Document == null ? HttpMethod.GET : HttpMethod.POST;
27+
HttpMethod IRequest.HttpMethod => (this.Document != null || this.Filter != null) ? HttpMethod.POST : HttpMethod.GET;
2528

2629
public TDocument Document { get; set; }
2730

2831
public IPerFieldAnalyzer PerFieldAnalyzer { get; set; }
2932

33+
public ITermVectorFilter Filter { get; set; }
34+
3035
partial void DocumentFromPath(TDocument document)
3136
{
3237
Self.Document = document;
@@ -38,15 +43,20 @@ partial void DocumentFromPath(TDocument document)
3843
[DescriptorFor("Termvectors")]
3944
public partial class TermVectorsDescriptor<TDocument> where TDocument : class
4045
{
41-
HttpMethod IRequest.HttpMethod => Self.Document == null ? HttpMethod.GET : HttpMethod.POST;
46+
HttpMethod IRequest.HttpMethod => (Self.Document != null || Self.Filter != null) ? HttpMethod.POST : HttpMethod.GET;
4247

4348
TDocument ITermVectorsRequest<TDocument>.Document { get; set; }
4449

4550
IPerFieldAnalyzer ITermVectorsRequest<TDocument>.PerFieldAnalyzer { get; set; }
4651

52+
ITermVectorFilter ITermVectorsRequest<TDocument>.Filter { get; set; }
53+
4754
public TermVectorsDescriptor<TDocument> Document(TDocument document) => Assign(a => a.Document = document);
4855

4956
public TermVectorsDescriptor<TDocument> PerFieldAnalyzer(Func<PerFieldAnalyzerDescriptor<TDocument>, IPromise<IPerFieldAnalyzer>> analyzerSelector) =>
5057
Assign(a => a.PerFieldAnalyzer = analyzerSelector?.Invoke(new PerFieldAnalyzerDescriptor<TDocument>())?.Value);
58+
59+
public TermVectorsDescriptor<TDocument> Filter(Func<TermVectorFilterDescriptor, ITermVectorFilter> filterSelector) =>
60+
Assign(a => a.Filter = filterSelector?.Invoke(new TermVectorFilterDescriptor()));
5161
}
5262
}

Diff for: src/Tests/Document/Multiple/MultiTermVectors/MultiTermVectorsApiTests.cs

+26-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,13 @@ protected override LazyResponses ClientUsage() => Calls(
4242
field_statistics = true,
4343
term_statistics = true,
4444
positions = true,
45-
offsets = true
45+
offsets = true,
46+
filter = new
47+
{
48+
max_num_terms = 3,
49+
min_term_freq = 1,
50+
min_doc_freq = 1
51+
}
4652
}).Take(2)
4753
};
4854

@@ -77,7 +83,18 @@ protected override void ExpectResponse(IMultiTermVectorsResponse response)
7783

7884
protected override Func<MultiTermVectorsDescriptor, IMultiTermVectorsRequest> Fluent => d => d
7985
.Index<Developer>()
80-
.GetMany<Developer>(Developer.Developers.Select(p => p.Id).Take(2), (p, i) => p.FieldStatistics().Payloads().TermStatistics().Positions().Offsets())
86+
.GetMany<Developer>(Developer.Developers.Select(p => p.Id).Take(2), (p, i) => p
87+
.FieldStatistics()
88+
.Payloads()
89+
.TermStatistics()
90+
.Positions()
91+
.Offsets()
92+
.Filter(f => f
93+
.MaximimumNumberOfTerms(3)
94+
.MinimumTermFrequency(1)
95+
.MinimumDocumentFrequency(1)
96+
)
97+
)
8198
;
8299

83100
protected override MultiTermVectorsRequest Initializer => new MultiTermVectorsRequest(Index<Developer>())
@@ -89,7 +106,13 @@ protected override void ExpectResponse(IMultiTermVectorsResponse response)
89106
Payloads = true,
90107
TermStatistics = true,
91108
Positions = true,
92-
Offsets = true
109+
Offsets = true,
110+
Filter = new TermVectorFilter
111+
{
112+
MaximumNumberOfTerms = 3,
113+
MinimumTermFrequency = 1,
114+
MinimumDocumentFrequency = 1
115+
}
93116
})
94117
};
95118
}

Diff for: src/Tests/Document/Single/TermVectors/TermVectorsApiTests.cs

+25-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99

1010
namespace Tests.Document.Single.TermVectors
1111
{
12-
[Collection(IntegrationContext.Indexing)]
12+
[Collection(IntegrationContext.ReadOnly)]
1313
public class TermVectorsApiTests : ApiIntegrationTestBase<ITermVectorsResponse, ITermVectorsRequest<Project>, TermVectorsDescriptor<Project>, TermVectorsRequest<Project>>
1414
{
15-
public TermVectorsApiTests(IndexingCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
15+
public TermVectorsApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { }
1616
protected override LazyResponses ClientUsage() => Calls(
1717
fluent: (client, f) => client.TermVectors(f),
1818
fluentAsync: (client, f) => client.TermVectorsAsync(f),
@@ -22,20 +22,42 @@ protected override LazyResponses ClientUsage() => Calls(
2222

2323
protected override bool ExpectIsValid => true;
2424
protected override int ExpectStatusCode => 200;
25-
protected override HttpMethod HttpMethod => HttpMethod.GET;
25+
protected override HttpMethod HttpMethod => HttpMethod.POST;
2626
protected override string UrlPath => $"/project/project/{Uri.EscapeDataString(Project.Instance.Name)}/_termvectors?offsets=true";
2727

2828
protected override bool SupportsDeserialization => false;
2929

30+
protected override object ExpectJson => new
31+
{
32+
filter = new
33+
{
34+
max_num_terms = 3,
35+
min_term_freq = 1,
36+
min_doc_freq = 1
37+
}
38+
};
39+
3040
protected override TermVectorsDescriptor<Project> NewDescriptor() => new TermVectorsDescriptor<Project>(typeof (Project), typeof (Project));
3141

3242
protected override Func<TermVectorsDescriptor<Project>, ITermVectorsRequest<Project>> Fluent => d=>d
3343
.Id(Id(Project.Instance))
3444
.Offsets()
45+
.Filter(f => f
46+
.MaximimumNumberOfTerms(3)
47+
.MinimumTermFrequency(1)
48+
.MinimumDocumentFrequency(1)
49+
)
3550
;
51+
3652
protected override TermVectorsRequest<Project> Initializer => new TermVectorsRequest<Project>(Project.Instance.Name)
3753
{
3854
Offsets = true,
55+
Filter = new TermVectorFilter
56+
{
57+
MaximumNumberOfTerms = 3,
58+
MinimumTermFrequency = 1,
59+
MinimumDocumentFrequency = 1
60+
}
3961
};
4062
}
4163
}

Diff for: src/Tests/tests.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# mode either u (unit test), i (integration test) or m (mixed mode)
2-
mode: u
2+
mode: m
33
# the elasticsearch version that should be started
4-
elasticsearch_version: 2.0.1
4+
elasticsearch_version: 2.2.0
55
# whether we want to forcefully reseed on the node, if you are starting the tests with a node already running
66
force_reseed: true
77
# do not spawn nodes as part of the test setup but rely on a manually started es node being up

0 commit comments

Comments
 (0)