diff --git a/src/CodeGeneration/CodeGeneration.LowLevelClient/Overrides/Descriptors/SearchDescriptorOverrides.cs b/src/CodeGeneration/CodeGeneration.LowLevelClient/Overrides/Descriptors/SearchDescriptorOverrides.cs index f1bf38a406d..4d3ba6d2fb6 100644 --- a/src/CodeGeneration/CodeGeneration.LowLevelClient/Overrides/Descriptors/SearchDescriptorOverrides.cs +++ b/src/CodeGeneration/CodeGeneration.LowLevelClient/Overrides/Descriptors/SearchDescriptorOverrides.cs @@ -27,7 +27,8 @@ public IEnumerable SkipQueryStringParams "_source_include", "_source_exclude", "track_scores", - "terminate_after" + "terminate_after", + "fielddata_fields" }; } } diff --git a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs index 475488f3b5d..145b088b379 100644 --- a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs +++ b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs @@ -5451,16 +5451,6 @@ public SearchRequestParameters Df(string df) } - internal IEnumerable _fielddata_fields { get; set; } - ///A comma-separated list of fields to return as the field data representation of a field for each hit - public SearchRequestParameters FielddataFields(params string[] fielddata_fields) - { - this._fielddata_fields = fielddata_fields.Select(f=>(object)f); - this.AddQueryString("fielddata_fields", this._fielddata_fields); - return this; - } - - internal bool _ignore_unavailable { get; set; } ///Whether specified concrete indices should be ignored when unavailable (missing or closed) public SearchRequestParameters IgnoreUnavailable(bool ignore_unavailable) diff --git a/src/Nest/DSL/Search/IGlobalInnerHit.cs b/src/Nest/DSL/Search/IGlobalInnerHit.cs index 862937f23be..b23e3ccf84b 100644 --- a/src/Nest/DSL/Search/IGlobalInnerHit.cs +++ b/src/Nest/DSL/Search/IGlobalInnerHit.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; +using System.Linq.Expressions; namespace Nest { @@ -35,7 +36,7 @@ public class GlobalInnerHitDescriptor : IGlobalInnerHit where T : class bool? IInnerHits.Explain { get; set; } ISourceFilter IInnerHits.Source { get; set; } bool? IInnerHits.Version { get; set; } - IEnumerable IInnerHits.FielddataFields { get; set; } + IList IInnerHits.FielddataFields { get; set; } IDictionary IInnerHits.ScriptFields { get; set; } public GlobalInnerHitDescriptor Query(Func, IQueryContainer> querySelector) @@ -89,13 +90,17 @@ public GlobalInnerHitDescriptor Name(string name) public GlobalInnerHitDescriptor FielddataFields(params string[] fielddataFields) { - Self.FielddataFields = fielddataFields; + if (fielddataFields.HasAny()) + return this; + Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList(); return this; } - public GlobalInnerHitDescriptor FielddataFields(IEnumerable fielddataFields) + public GlobalInnerHitDescriptor FielddataFields(params Expression>[] fielddataFields) { - Self.FielddataFields = fielddataFields; + if (!fielddataFields.HasAny()) + return this; + Self.FielddataFields = fielddataFields.Select(e => (PropertyPathMarker)e).ToList(); return this; } diff --git a/src/Nest/DSL/Search/InnerHitsDescriptor.cs b/src/Nest/DSL/Search/InnerHitsDescriptor.cs index 882c96c1bc6..3c4a6442a22 100644 --- a/src/Nest/DSL/Search/InnerHitsDescriptor.cs +++ b/src/Nest/DSL/Search/InnerHitsDescriptor.cs @@ -36,7 +36,7 @@ public interface IInnerHits bool? Version { get; set; } [JsonProperty(PropertyName = "fielddata_fields")] - IEnumerable FielddataFields { get; set; } + IList FielddataFields { get; set; } [JsonProperty(PropertyName = "script_fields")] [JsonConverter(typeof (DictionaryKeysAreNotPropertyNamesJsonConverter))] @@ -62,7 +62,7 @@ public class InnerHits : IInnerHits public bool? Version { get; set; } - public IEnumerable FielddataFields { get; set; } + public IList FielddataFields { get; set; } public IDictionary ScriptFields { get; set; } } @@ -79,7 +79,7 @@ public class InnerHitsDescriptor : IInnerHits where T : class bool? IInnerHits.Explain { get; set; } ISourceFilter IInnerHits.Source { get; set; } bool? IInnerHits.Version { get; set; } - IEnumerable IInnerHits.FielddataFields { get; set; } + IList IInnerHits.FielddataFields { get; set; } IDictionary IInnerHits.ScriptFields { get; set; } public InnerHitsDescriptor From(int? from) @@ -102,13 +102,17 @@ public InnerHitsDescriptor Name(string name) public InnerHitsDescriptor FielddataFields(params string[] fielddataFields) { - Self.FielddataFields = fielddataFields; + if (fielddataFields.HasAny()) + return this; + Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList(); return this; } - public InnerHitsDescriptor FielddataFields(IEnumerable fielddataFields) + public InnerHitsDescriptor FielddataFields(params Expression>[] fielddataFields) { - Self.FielddataFields = fielddataFields; + if (!fielddataFields.HasAny()) + return this; + Self.FielddataFields = fielddataFields.Select(e => (PropertyPathMarker)e).ToList(); return this; } diff --git a/src/Nest/DSL/SearchDescriptor.cs b/src/Nest/DSL/SearchDescriptor.cs index 93d4c32575e..bcf554141d4 100644 --- a/src/Nest/DSL/SearchDescriptor.cs +++ b/src/Nest/DSL/SearchDescriptor.cs @@ -63,6 +63,9 @@ public interface ISearchRequest : IQueryPath [JsonProperty(PropertyName = "fields")] IList Fields { get; set; } + [JsonProperty(PropertyName = "fielddata_fields")] + IList FielddataFields { get; set; } + [JsonProperty(PropertyName = "script_fields")] [JsonConverter(typeof (DictionaryKeysAreNotPropertyNamesJsonConverter))] IDictionary ScriptFields { get; set; } @@ -155,6 +158,7 @@ public SearchRequest(IEnumerable indices, IEnumerable Fields { get; set; } + public IList FielddataFields { get; set; } public IDictionary ScriptFields { get; set; } public ISourceFilter Source { get; set; } public IList> Sort { get; set; } @@ -237,6 +241,7 @@ protected override void UpdatePathInfo(IConnectionSettingsValues settings, Elast public IHighlightRequest Highlight { get; set; } public IRescore Rescore { get; set; } public IList Fields { get; set; } + public IList FielddataFields { get; set; } public IDictionary ScriptFields { get; set; } public ISourceFilter Source { get; set; } public IDictionary InnerHits { get; set; } @@ -350,6 +355,8 @@ string ISearchRequest.Routing IList ISearchRequest.Fields { get; set; } + IList ISearchRequest.FielddataFields { get; set; } + IDictionary ISearchRequest.ScriptFields { get; set; } ISourceFilter ISearchRequest.Source { get; set; } @@ -617,6 +624,28 @@ public SearchDescriptor Fields(params string[] fields) return this; } + /// + ///A comma-separated list of fields to return as the field data representation of a field for each hit + /// + public SearchDescriptor FielddataFields(params string[] fielddataFields) + { + if (fielddataFields.HasAny()) + return this; + Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList(); + return this; + } + + /// + ///A comma-separated list of fields to return as the field data representation of a field for each hit + /// + public SearchDescriptor FielddataFields(params Expression>[] fielddataFields) + { + if (!fielddataFields.HasAny()) + return this; + Self.FielddataFields = fielddataFields.Select(f => (PropertyPathMarker)f).ToList(); + return this; + } + public SearchDescriptor ScriptFields( Func>, FluentDictionary>> scriptFields) diff --git a/src/Nest/DSL/_Descriptors.generated.cs b/src/Nest/DSL/_Descriptors.generated.cs index a7265a04d15..0d71f430306 100644 --- a/src/Nest/DSL/_Descriptors.generated.cs +++ b/src/Nest/DSL/_Descriptors.generated.cs @@ -5079,25 +5079,6 @@ public SearchDescriptor Df(string df) } - ///A comma-separated list of fields to return as the field data representation of a field for each hit - public SearchDescriptor FielddataFields(params string[] fielddata_fields) - { - this.Request.RequestParameters.FielddataFields(fielddata_fields); - return this; - } - - - ///A comma-separated list of fields to return as the field data representation of a field for each hit - public SearchDescriptor FielddataFields(params Expression>[] typedPathLookups) - { - if (!typedPathLookups.HasAny()) - return this; - - this.Request.RequestParameters._FielddataFields(typedPathLookups); - return this; - } - - ///Whether specified concrete indices should be ignored when unavailable (missing or closed) public SearchDescriptor IgnoreUnavailable(bool ignore_unavailable = true) { diff --git a/src/Nest/DSL/_Requests.generated.cs b/src/Nest/DSL/_Requests.generated.cs index 030f4923f1e..abc88d6d57c 100644 --- a/src/Nest/DSL/_Requests.generated.cs +++ b/src/Nest/DSL/_Requests.generated.cs @@ -4572,14 +4572,6 @@ public string Df } - ///A comma-separated list of fields to return as the field data representation of a field for each hit - public IList FielddataFields - { - get { return this.Request.RequestParameters.GetQueryStringValue>("fielddata_fields"); } - set { this.Request.RequestParameters.AddQueryString("fielddata_fields", value); } - } - - ///Whether specified concrete indices should be ignored when unavailable (missing or closed) public bool IgnoreUnavailable { @@ -6481,14 +6473,6 @@ public string Df } - ///A comma-separated list of fields to return as the field data representation of a field for each hit - public IList FielddataFields - { - get { return this.Request.RequestParameters.GetQueryStringValue>("fielddata_fields"); } - set { this.Request.RequestParameters.AddQueryString("fielddata_fields", value); } - } - - ///Whether specified concrete indices should be ignored when unavailable (missing or closed) public bool IgnoreUnavailable { diff --git a/src/Nest/Domain/RequestParametersExtensions.Generated.cs b/src/Nest/Domain/RequestParametersExtensions.Generated.cs index e84e68de4d7..f2b0c82ddd0 100644 --- a/src/Nest/Domain/RequestParametersExtensions.Generated.cs +++ b/src/Nest/Domain/RequestParametersExtensions.Generated.cs @@ -281,18 +281,6 @@ internal static NodesStatsRequestParameters _Fields( } - ///A comma-separated list of fields to return as the field data representation of a field for each hit - internal static SearchRequestParameters _FielddataFields( - this SearchRequestParameters qs, - IEnumerable>> fielddata_fields) - where T : class - { - var _fielddata_fields = fielddata_fields.Select(e=>(PropertyPathMarker)e); - qs.AddQueryString("fielddata_fields", _fielddata_fields); - return qs; - } - - ///Specify which field to use for suggestions internal static SearchRequestParameters _SuggestField( this SearchRequestParameters qs, diff --git a/src/Tests/Nest.Tests.Integration/Search/FieldTests/FieldsTest.cs b/src/Tests/Nest.Tests.Integration/Search/FieldTests/FieldsTest.cs index 71c11733c0f..fe0a98a7bbf 100644 --- a/src/Tests/Nest.Tests.Integration/Search/FieldTests/FieldsTest.cs +++ b/src/Tests/Nest.Tests.Integration/Search/FieldTests/FieldsTest.cs @@ -54,5 +54,21 @@ public void Search_WithFieldsRemoved_ReturnsDocuments_ResultingArrayOfDocsShould } } + + [Test] + public void FielddataFieldsTest() + { + var result = this.Client.Search(s => s + .FielddataFields(p => p.Name) + ); + + result.IsValid.Should().BeTrue(); + + foreach(var hit in result.Hits) + { + var fieldValues = hit.Fields.FieldValues("name"); + fieldValues.Should().NotBeEmpty(); + } + } } } \ No newline at end of file diff --git a/src/Tests/Nest.Tests.Integration/Search/InnerHitsTests.cs b/src/Tests/Nest.Tests.Integration/Search/InnerHitsTests.cs index 32e35e3d43e..0ca2b8f3597 100644 --- a/src/Tests/Nest.Tests.Integration/Search/InnerHitsTests.cs +++ b/src/Tests/Nest.Tests.Integration/Search/InnerHitsTests.cs @@ -122,6 +122,7 @@ public void Search() .InnerHits(innerInnerHits => innerInnerHits .Add("barons", iii => iii.Type()) ) + .FielddataFields(p => p.Name) ) ) .Add("princes", i => i.Type()) @@ -136,6 +137,8 @@ public void Search() var earlHits = hit.InnerHits["earls"].Hits; earlHits.Total.Should().BeGreaterThan(0); earlHits.Hits.Should().NotBeEmpty().And.HaveCount(5); + foreach(var earlHit in earlHits.Hits) + earlHit.Fields.FieldValues("name").Should().NotBeEmpty(); var earls = earlHits.Documents(); earls.Should().NotBeEmpty().And.OnlyContain(earl => !earl.Name.IsNullOrEmpty()); foreach (var earlHit in earlHits.Hits)