diff --git a/docs/aggregations/metric/top-hits/top-hits-aggregation-usage.asciidoc b/docs/aggregations/metric/top-hits/top-hits-aggregation-usage.asciidoc index ee5fb30b9ed..89882e3dce2 100644 --- a/docs/aggregations/metric/top-hits/top-hits-aggregation-usage.asciidoc +++ b/docs/aggregations/metric/top-hits/top-hits-aggregation-usage.asciidoc @@ -28,8 +28,18 @@ s => s .Aggregations(aa => aa .TopHits("top_state_hits", th => th .Sort(srt => srt - .Field(p => p.StartedOn) - .Order(SortOrder.Descending) + .Field(sf => sf + .Field(p => p.StartedOn) + .Order(SortOrder.Descending) + ) + .Script(ss => ss + .Type("number") + .Script(sss => sss + .Inline("Math.sin(34*(double)doc['numberOfCommits'].value)") + .Lang("painless") + ) + .Order(SortOrder.Descending) + ) ) .Source(src => src .Includes(fs => fs @@ -79,7 +89,13 @@ new SearchRequest { Sort = new List { - new SortField { Field = Field(p => p.StartedOn), Order = SortOrder.Descending } + new SortField { Field = Field(p => p.StartedOn), Order = SortOrder.Descending }, + new ScriptSort + { + Type = "number", + Script = new InlineScript("Math.sin(34*(double)doc['numberOfCommits'].value)") { Lang = "painless" }, + Order = SortOrder.Descending + }, }, Source = new SourceFilter { @@ -127,6 +143,16 @@ new SearchRequest "startedOn": { "order": "desc" } + }, + { + "_script": { + "type": "number", + "script": { + "lang": "painless", + "inline": "Math.sin(34*(double)doc['numberOfCommits'].value)" + }, + "order": "desc" + } } ], "_source": { diff --git a/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs b/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs index ab8b6586fa0..47187bfccf6 100644 --- a/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs +++ b/src/Nest/Aggregations/Metric/TopHits/TopHitsAggregation.cs @@ -95,6 +95,7 @@ public class TopHitsAggregationDescriptor public TopHitsAggregationDescriptor Size(int size) => Assign(a => a.Size = size); + [Obsolete("Use Sort(Func, IPromise>>) that accepts multiple sort options")] public TopHitsAggregationDescriptor Sort(Func, IFieldSort> sortSelector) => Assign(a => { a.Sort = a.Sort ?? new List(); @@ -102,6 +103,9 @@ public TopHitsAggregationDescriptor Sort(Func, IFieldS if (sort != null) a.Sort.Add(sort); }); + public TopHitsAggregationDescriptor Sort(Func, IPromise>> sortSelector) => + Assign(a => a.Sort = sortSelector?.Invoke(new SortDescriptor())?.Value); + public TopHitsAggregationDescriptor Source(bool enabled = true) => Assign(a => a.Source = enabled); diff --git a/src/Tests/Aggregations/Metric/TopHits/TopHitsAggregationUsageTests.cs b/src/Tests/Aggregations/Metric/TopHits/TopHitsAggregationUsageTests.cs index 7ebc29fdaac..ad503ad18b9 100644 --- a/src/Tests/Aggregations/Metric/TopHits/TopHitsAggregationUsageTests.cs +++ b/src/Tests/Aggregations/Metric/TopHits/TopHitsAggregationUsageTests.cs @@ -39,6 +39,19 @@ public TopHitsAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : ba { order = "desc" } + }, + new + { + _script = new + { + type = "number", + script = new + { + lang = "painless", + inline = "Math.sin(34*(double)doc['numberOfCommits'].value)" + }, + order = "desc" + } } }, _source = new @@ -84,8 +97,18 @@ public TopHitsAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : ba .Aggregations(aa => aa .TopHits("top_state_hits", th => th .Sort(srt => srt - .Field(p => p.StartedOn) - .Order(SortOrder.Descending) + .Field(sf => sf + .Field(p => p.StartedOn) + .Order(SortOrder.Descending) + ) + .Script(ss => ss + .Type("number") + .Script(sss => sss + .Inline("Math.sin(34*(double)doc['numberOfCommits'].value)") + .Lang("painless") + ) + .Order(SortOrder.Descending) + ) ) .Source(src => src .Includes(fs => fs @@ -131,7 +154,13 @@ public TopHitsAggregationUsageTests(ReadOnlyCluster i, EndpointUsage usage) : ba { Sort = new List { - new SortField { Field = Field(p => p.StartedOn), Order = SortOrder.Descending } + new SortField { Field = Field(p => p.StartedOn), Order = SortOrder.Descending }, + new ScriptSort + { + Type = "number", + Script = new InlineScript("Math.sin(34*(double)doc['numberOfCommits'].value)") { Lang = "painless" }, + Order = SortOrder.Descending + }, }, Source = new SourceFilter {