Skip to content

Commit 9fbf9ca

Browse files
committed
Merge pull request #1387 from elastic/feature/fielddata-fields
Fix fielddata fields on search and inner hits
2 parents 0fdcdbf + 3152ea6 commit 9fbf9ca

File tree

10 files changed

+69
-68
lines changed

10 files changed

+69
-68
lines changed

src/CodeGeneration/CodeGeneration.LowLevelClient/Overrides/Descriptors/SearchDescriptorOverrides.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public IEnumerable<string> SkipQueryStringParams
2727
"_source_include",
2828
"_source_exclude",
2929
"track_scores",
30-
"terminate_after"
30+
"terminate_after",
31+
"fielddata_fields"
3132
};
3233
}
3334
}

src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5451,16 +5451,6 @@ public SearchRequestParameters Df(string df)
54515451
}
54525452

54535453

5454-
internal IEnumerable<object> _fielddata_fields { get; set; }
5455-
///<summary>A comma-separated list of fields to return as the field data representation of a field for each hit</summary>
5456-
public SearchRequestParameters FielddataFields(params string[] fielddata_fields)
5457-
{
5458-
this._fielddata_fields = fielddata_fields.Select(f=>(object)f);
5459-
this.AddQueryString("fielddata_fields", this._fielddata_fields);
5460-
return this;
5461-
}
5462-
5463-
54645454
internal bool _ignore_unavailable { get; set; }
54655455
///<summary>Whether specified concrete indices should be ignored when unavailable (missing or closed)</summary>
54665456
public SearchRequestParameters IgnoreUnavailable(bool ignore_unavailable)

src/Nest/DSL/Search/IGlobalInnerHit.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using Newtonsoft.Json;
5+
using System.Linq.Expressions;
56

67
namespace Nest
78
{
@@ -35,7 +36,7 @@ public class GlobalInnerHitDescriptor<T> : IGlobalInnerHit where T : class
3536
bool? IInnerHits.Explain { get; set; }
3637
ISourceFilter IInnerHits.Source { get; set; }
3738
bool? IInnerHits.Version { get; set; }
38-
IEnumerable<string> IInnerHits.FielddataFields { get; set; }
39+
IList<PropertyPathMarker> IInnerHits.FielddataFields { get; set; }
3940
IDictionary<string, IScriptFilter> IInnerHits.ScriptFields { get; set; }
4041

4142
public GlobalInnerHitDescriptor<T> Query(Func<QueryDescriptor<T>, IQueryContainer> querySelector)
@@ -89,13 +90,17 @@ public GlobalInnerHitDescriptor<T> Name(string name)
8990

9091
public GlobalInnerHitDescriptor<T> FielddataFields(params string[] fielddataFields)
9192
{
92-
Self.FielddataFields = fielddataFields;
93+
if (fielddataFields.HasAny())
94+
return this;
95+
Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList();
9396
return this;
9497
}
9598

96-
public GlobalInnerHitDescriptor<T> FielddataFields(IEnumerable<string> fielddataFields)
99+
public GlobalInnerHitDescriptor<T> FielddataFields(params Expression<Func<T, object>>[] fielddataFields)
97100
{
98-
Self.FielddataFields = fielddataFields;
101+
if (!fielddataFields.HasAny())
102+
return this;
103+
Self.FielddataFields = fielddataFields.Select(e => (PropertyPathMarker)e).ToList();
99104
return this;
100105
}
101106

src/Nest/DSL/Search/InnerHitsDescriptor.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public interface IInnerHits
3636
bool? Version { get; set; }
3737

3838
[JsonProperty(PropertyName = "fielddata_fields")]
39-
IEnumerable<string> FielddataFields { get; set; }
39+
IList<PropertyPathMarker> FielddataFields { get; set; }
4040

4141
[JsonProperty(PropertyName = "script_fields")]
4242
[JsonConverter(typeof (DictionaryKeysAreNotPropertyNamesJsonConverter))]
@@ -62,7 +62,7 @@ public class InnerHits : IInnerHits
6262

6363
public bool? Version { get; set; }
6464

65-
public IEnumerable<string> FielddataFields { get; set; }
65+
public IList<PropertyPathMarker> FielddataFields { get; set; }
6666

6767
public IDictionary<string, IScriptFilter> ScriptFields { get; set; }
6868
}
@@ -79,7 +79,7 @@ public class InnerHitsDescriptor<T> : IInnerHits where T : class
7979
bool? IInnerHits.Explain { get; set; }
8080
ISourceFilter IInnerHits.Source { get; set; }
8181
bool? IInnerHits.Version { get; set; }
82-
IEnumerable<string> IInnerHits.FielddataFields { get; set; }
82+
IList<PropertyPathMarker> IInnerHits.FielddataFields { get; set; }
8383
IDictionary<string, IScriptFilter> IInnerHits.ScriptFields { get; set; }
8484

8585
public InnerHitsDescriptor<T> From(int? from)
@@ -102,13 +102,17 @@ public InnerHitsDescriptor<T> Name(string name)
102102

103103
public InnerHitsDescriptor<T> FielddataFields(params string[] fielddataFields)
104104
{
105-
Self.FielddataFields = fielddataFields;
105+
if (fielddataFields.HasAny())
106+
return this;
107+
Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList();
106108
return this;
107109
}
108110

109-
public InnerHitsDescriptor<T> FielddataFields(IEnumerable<string> fielddataFields)
111+
public InnerHitsDescriptor<T> FielddataFields(params Expression<Func<T, object>>[] fielddataFields)
110112
{
111-
Self.FielddataFields = fielddataFields;
113+
if (!fielddataFields.HasAny())
114+
return this;
115+
Self.FielddataFields = fielddataFields.Select(e => (PropertyPathMarker)e).ToList();
112116
return this;
113117
}
114118

src/Nest/DSL/SearchDescriptor.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ public interface ISearchRequest : IQueryPath<SearchRequestParameters>
6363
[JsonProperty(PropertyName = "fields")]
6464
IList<PropertyPathMarker> Fields { get; set; }
6565

66+
[JsonProperty(PropertyName = "fielddata_fields")]
67+
IList<PropertyPathMarker> FielddataFields { get; set; }
68+
6669
[JsonProperty(PropertyName = "script_fields")]
6770
[JsonConverter(typeof (DictionaryKeysAreNotPropertyNamesJsonConverter))]
6871
IDictionary<string, IScriptFilter> ScriptFields { get; set; }
@@ -155,6 +158,7 @@ public SearchRequest(IEnumerable<IndexNameMarker> indices, IEnumerable<TypeNameM
155158
public double? MinScore { get; set; }
156159
public long? TerminateAfter { get; set; }
157160
public IList<PropertyPathMarker> Fields { get; set; }
161+
public IList<PropertyPathMarker> FielddataFields { get; set; }
158162
public IDictionary<string, IScriptFilter> ScriptFields { get; set; }
159163
public ISourceFilter Source { get; set; }
160164
public IList<KeyValuePair<PropertyPathMarker, ISort>> Sort { get; set; }
@@ -237,6 +241,7 @@ protected override void UpdatePathInfo(IConnectionSettingsValues settings, Elast
237241
public IHighlightRequest Highlight { get; set; }
238242
public IRescore Rescore { get; set; }
239243
public IList<PropertyPathMarker> Fields { get; set; }
244+
public IList<PropertyPathMarker> FielddataFields { get; set; }
240245
public IDictionary<string, IScriptFilter> ScriptFields { get; set; }
241246
public ISourceFilter Source { get; set; }
242247
public IDictionary<string, IInnerHitsContainer> InnerHits { get; set; }
@@ -350,6 +355,8 @@ string ISearchRequest.Routing
350355

351356
IList<PropertyPathMarker> ISearchRequest.Fields { get; set; }
352357

358+
IList<PropertyPathMarker> ISearchRequest.FielddataFields { get; set; }
359+
353360
IDictionary<string, IScriptFilter> ISearchRequest.ScriptFields { get; set; }
354361

355362
ISourceFilter ISearchRequest.Source { get; set; }
@@ -617,6 +624,28 @@ public SearchDescriptor<T> Fields(params string[] fields)
617624
return this;
618625
}
619626

627+
///<summary>
628+
///A comma-separated list of fields to return as the field data representation of a field for each hit
629+
///</summary>
630+
public SearchDescriptor<T> FielddataFields(params string[] fielddataFields)
631+
{
632+
if (fielddataFields.HasAny())
633+
return this;
634+
Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList();
635+
return this;
636+
}
637+
638+
///<summary>
639+
///A comma-separated list of fields to return as the field data representation of a field for each hit
640+
///</summary>
641+
public SearchDescriptor<T> FielddataFields(params Expression<Func<T, object>>[] fielddataFields)
642+
{
643+
if (!fielddataFields.HasAny())
644+
return this;
645+
Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList();
646+
return this;
647+
}
648+
620649
public SearchDescriptor<T> ScriptFields(
621650
Func<FluentDictionary<string, Func<ScriptFilterDescriptor, ScriptFilterDescriptor>>,
622651
FluentDictionary<string, Func<ScriptFilterDescriptor, ScriptFilterDescriptor>>> scriptFields)

src/Nest/DSL/_Descriptors.generated.cs

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5073,25 +5073,6 @@ public SearchDescriptor<T> Df(string df)
50735073
}
50745074

50755075

5076-
///<summary>A comma-separated list of fields to return as the field data representation of a field for each hit</summary>
5077-
public SearchDescriptor<T> FielddataFields(params string[] fielddata_fields)
5078-
{
5079-
this.Request.RequestParameters.FielddataFields(fielddata_fields);
5080-
return this;
5081-
}
5082-
5083-
5084-
///<summary>A comma-separated list of fields to return as the field data representation of a field for each hit</summary>
5085-
public SearchDescriptor<T> FielddataFields(params Expression<Func<T, object>>[] typedPathLookups)
5086-
{
5087-
if (!typedPathLookups.HasAny())
5088-
return this;
5089-
5090-
this.Request.RequestParameters._FielddataFields(typedPathLookups);
5091-
return this;
5092-
}
5093-
5094-
50955076
///<summary>Whether specified concrete indices should be ignored when unavailable (missing or closed)</summary>
50965077
public SearchDescriptor<T> IgnoreUnavailable(bool ignore_unavailable = true)
50975078
{

src/Nest/DSL/_Requests.generated.cs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4566,14 +4566,6 @@ public string Df
45664566
}
45674567

45684568

4569-
///<summary>A comma-separated list of fields to return as the field data representation of a field for each hit</summary>
4570-
public IList<PropertyPathMarker> FielddataFields
4571-
{
4572-
get { return this.Request.RequestParameters.GetQueryStringValue<IList<PropertyPathMarker>>("fielddata_fields"); }
4573-
set { this.Request.RequestParameters.AddQueryString("fielddata_fields", value); }
4574-
}
4575-
4576-
45774569
///<summary>Whether specified concrete indices should be ignored when unavailable (missing or closed)</summary>
45784570
public bool IgnoreUnavailable
45794571
{
@@ -6475,14 +6467,6 @@ public string Df
64756467
}
64766468

64776469

6478-
///<summary>A comma-separated list of fields to return as the field data representation of a field for each hit</summary>
6479-
public IList<PropertyPathMarker> FielddataFields
6480-
{
6481-
get { return this.Request.RequestParameters.GetQueryStringValue<IList<PropertyPathMarker>>("fielddata_fields"); }
6482-
set { this.Request.RequestParameters.AddQueryString("fielddata_fields", value); }
6483-
}
6484-
6485-
64866470
///<summary>Whether specified concrete indices should be ignored when unavailable (missing or closed)</summary>
64876471
public bool IgnoreUnavailable
64886472
{

src/Nest/Domain/RequestParametersExtensions.Generated.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -281,18 +281,6 @@ internal static NodesStatsRequestParameters _Fields<T>(
281281
}
282282

283283

284-
///<summary>A comma-separated list of fields to return as the field data representation of a field for each hit</summary>
285-
internal static SearchRequestParameters _FielddataFields<T>(
286-
this SearchRequestParameters qs,
287-
IEnumerable<Expression<Func<T, object>>> fielddata_fields)
288-
where T : class
289-
{
290-
var _fielddata_fields = fielddata_fields.Select(e=>(PropertyPathMarker)e);
291-
qs.AddQueryString("fielddata_fields", _fielddata_fields);
292-
return qs;
293-
}
294-
295-
296284
///<summary>Specify which field to use for suggestions</summary>
297285
internal static SearchRequestParameters _SuggestField<T>(
298286
this SearchRequestParameters qs,

src/Tests/Nest.Tests.Integration/Search/FieldTests/FieldsTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,21 @@ public void Search_WithFieldsRemoved_ReturnsDocuments_ResultingArrayOfDocsShould
5454
}
5555

5656
}
57+
58+
[Test]
59+
public void FielddataFieldsTest()
60+
{
61+
var result = this.Client.Search<ElasticsearchProject>(s => s
62+
.FielddataFields(p => p.Name)
63+
);
64+
65+
result.IsValid.Should().BeTrue();
66+
67+
foreach(var hit in result.Hits)
68+
{
69+
var fieldValues = hit.Fields.FieldValues<string[]>("name");
70+
fieldValues.Should().NotBeEmpty();
71+
}
72+
}
5773
}
5874
}

src/Tests/Nest.Tests.Integration/Search/InnerHitsTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public void Search()
122122
.InnerHits(innerInnerHits => innerInnerHits
123123
.Add("barons", iii => iii.Type<Baron>())
124124
)
125+
.FielddataFields(p => p.Name)
125126
)
126127
)
127128
.Add("princes", i => i.Type<Prince>())
@@ -136,6 +137,8 @@ public void Search()
136137
var earlHits = hit.InnerHits["earls"].Hits;
137138
earlHits.Total.Should().BeGreaterThan(0);
138139
earlHits.Hits.Should().NotBeEmpty().And.HaveCount(5);
140+
foreach(var earlHit in earlHits.Hits)
141+
earlHit.Fields.FieldValues<string[]>("name").Should().NotBeEmpty();
139142
var earls = earlHits.Documents<Earl>();
140143
earls.Should().NotBeEmpty().And.OnlyContain(earl => !earl.Name.IsNullOrEmpty());
141144
foreach (var earlHit in earlHits.Hits)

0 commit comments

Comments
 (0)