Skip to content

Commit 0586087

Browse files
committed
Merge pull request #975 from elasticsearch/feature/phrase-suggest-collate
Add Collate support to phrase suggester
2 parents 8005509 + ba24e81 commit 0586087

File tree

4 files changed

+153
-0
lines changed

4 files changed

+153
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using Newtonsoft.Json;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
7+
namespace Nest
8+
{
9+
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
10+
public interface IPhraseSuggestCollate
11+
{
12+
[JsonProperty(PropertyName = "query")]
13+
IQueryContainer Query { get; set; }
14+
15+
[JsonProperty(PropertyName = "filter")]
16+
IFilterContainer Filter { get; set; }
17+
18+
[JsonProperty(PropertyName = "params")]
19+
IDictionary<string, object> Params { get; set; }
20+
21+
[JsonProperty(PropertyName = "preference")]
22+
string Preference { get; set; }
23+
}
24+
25+
public class PhraseSuggestCollate : IPhraseSuggestCollate
26+
{
27+
public IQueryContainer Query { get; set; }
28+
29+
public IFilterContainer Filter { get; set; }
30+
31+
public IDictionary<string, object> Params { get; set; }
32+
33+
public string Preference { get; set; }
34+
}
35+
36+
public class PhraseSuggestCollateDescriptor<T> : IPhraseSuggestCollate
37+
where T : class
38+
{
39+
internal IPhraseSuggestCollate Collate = new PhraseSuggestCollate();
40+
41+
IQueryContainer IPhraseSuggestCollate.Query { get; set; }
42+
43+
IFilterContainer IPhraseSuggestCollate.Filter { get; set; }
44+
45+
IDictionary<string, object> IPhraseSuggestCollate.Params { get; set; }
46+
47+
string IPhraseSuggestCollate.Preference { get; set; }
48+
49+
public PhraseSuggestCollateDescriptor<T> Query(Func<QueryDescriptor<T>, QueryContainer> query)
50+
{
51+
this.Collate.Query = query(new QueryDescriptor<T>());
52+
return this;
53+
}
54+
55+
public PhraseSuggestCollateDescriptor<T> Filter(Func<FilterDescriptor<T>, FilterContainer> filter)
56+
{
57+
this.Collate.Filter = filter(new FilterDescriptor<T>());
58+
return this;
59+
}
60+
61+
public PhraseSuggestCollateDescriptor<T> Params(IDictionary<string, object> paramsDictionary)
62+
{
63+
this.Collate.Params = paramsDictionary;
64+
return this;
65+
}
66+
67+
public PhraseSuggestCollateDescriptor<T> Params(Func<FluentDictionary<string, object>, FluentDictionary<string, object>> paramsDictionary)
68+
{
69+
this.Collate.Params = paramsDictionary(new FluentDictionary<string, object>());
70+
return this;
71+
}
72+
73+
public PhraseSuggestCollateDescriptor<T> Preference(string preference)
74+
{
75+
this.Collate.Preference = preference;
76+
return this;
77+
}
78+
}
79+
80+
}

src/Nest/DSL/Suggest/PhraseSuggestDescriptor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public interface IPhraseSuggester : ISuggester
2828

2929
[JsonProperty(PropertyName = "direct_generator")]
3030
IEnumerable<IDirectGenerator> DirectGenerator { get; set; }
31+
32+
[JsonProperty("collate")]
33+
IPhraseSuggestCollate Collate { get; set; }
3134
}
3235

3336
public class PhraseSuggester : Suggester, IPhraseSuggester
@@ -38,6 +41,8 @@ public class PhraseSuggester : Suggester, IPhraseSuggester
3841
public decimal? MaxErrors { get; set; }
3942
public char? Separator { get; set; }
4043
public IEnumerable<IDirectGenerator> DirectGenerator { get; set; }
44+
45+
public IPhraseSuggestCollate Collate { get; set; }
4146
}
4247

4348
public class PhraseSuggestDescriptor<T> : BaseSuggestDescriptor<T>, IPhraseSuggester where T : class
@@ -56,6 +61,8 @@ public class PhraseSuggestDescriptor<T> : BaseSuggestDescriptor<T>, IPhraseSugge
5661

5762
IEnumerable<IDirectGenerator> IPhraseSuggester.DirectGenerator { get; set; }
5863

64+
IPhraseSuggestCollate IPhraseSuggester.Collate { get; set; }
65+
5966
public PhraseSuggestDescriptor<T> Text(string text)
6067
{
6168
Self.Text = text;
@@ -121,5 +128,12 @@ public PhraseSuggestDescriptor<T> DirectGenerator(params Func<DirectGeneratorDes
121128
Self.DirectGenerator = generators.Select(g => g(new DirectGeneratorDescriptor<T>())).ToList();
122129
return this;
123130
}
131+
132+
public PhraseSuggestDescriptor<T> Collate(Func<PhraseSuggestCollateDescriptor<T>, PhraseSuggestCollateDescriptor<T>> collateDescriptor)
133+
{
134+
var selector = collateDescriptor(new PhraseSuggestCollateDescriptor<T>());
135+
Self.Collate = selector.Collate;
136+
return this;
137+
}
124138
}
125139
}

src/Nest/Nest.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@
238238
<Compile Include="DSL\Paths\RepositorySnapshotOptionalPathDescriptor.cs" />
239239
<Compile Include="DSL\SnapshotStatusDescriptor.cs" />
240240
<Compile Include="DSL\RecoveryStatusDescriptor.cs" />
241+
<Compile Include="DSL\Suggest\PhraseSuggestCollateDescriptor.cs" />
241242
<Compile Include="DSL\TemplateExistsDescriptor.cs" />
242243
<Compile Include="Domain\Responses\PingResponse.cs" />
243244
<Compile Include="Domain\Responses\NodesShutdownResponse.cs" />

src/Tests/Nest.Tests.Unit/Search/suggest/PhraseSuggestTests.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Elasticsearch.Net;
22
using NUnit.Framework;
33
using Nest.Tests.MockData.Domain;
4+
using System.Collections.Generic;
45

56
namespace Nest.Tests.Unit.Search.Suggest
67
{
@@ -84,5 +85,62 @@ public void PhraseSuggestOnSearchTest()
8485
var json = search.ConnectionStatus.Request.Utf8String();
8586
Assert.True(json.JsonEquals(expected), json);
8687
}
88+
89+
[Test]
90+
public void PhraseSuggestCollateTest()
91+
{
92+
var search = this._client.Search<ElasticsearchProject>(s => s
93+
.SuggestPhrase("myphrasesuggest", ts => ts
94+
.Text("n")
95+
.Analyzer("body")
96+
.OnField("bigram")
97+
.Size(1)
98+
.GramSize(2)
99+
.MaxErrors(0.5m)
100+
.Collate(c => c
101+
.Query(q => q
102+
.Match(m => m
103+
.OnField("{{fieldname}}")
104+
.Query("{{suggestion}}")
105+
)
106+
)
107+
.Params(ps => ps
108+
.Add("{{fieldname}}", "name")
109+
)
110+
.Preference("_primary")
111+
)
112+
)
113+
);
114+
115+
var expected = @"{
116+
suggest: {
117+
myphrasesuggest: {
118+
text: ""n"",
119+
phrase: {
120+
""field"": ""bigram"",
121+
""analyzer"": ""body"",
122+
""size"": 1,
123+
""gram_size"": 2,
124+
""max_errors"": 0.5,
125+
""collate"": {
126+
""query"": {
127+
""match"": {
128+
""{{fieldname}}"": {
129+
""query"": ""{{suggestion}}""
130+
}
131+
}
132+
},
133+
""params"": {
134+
""{{fieldname}}"": ""name""
135+
},
136+
""preference"": ""_primary""
137+
}
138+
}
139+
}
140+
}
141+
}";
142+
var json = search.ConnectionStatus.Request.Utf8String();
143+
Assert.True(json.JsonEquals(expected), json);
144+
}
87145
}
88146
}

0 commit comments

Comments
 (0)