Спасибо за ответ!
Я сделала скрипт прямо в агрегации и таким образом она берет либо GroupId либо Id с минусом, т.к они могут быть одинаковыми
private readonly string _customGroupIdScript = "if (doc['groupId'].empty || doc['groupId'].value == null || doc['groupId'].value == 0)"
+ "{ return -(Long.parseLong(doc['id'].value)); } "
+ "else { return doc['groupId'].value; }";
body.Aggregations(
aggs => aggs
.Terms(
"groupId",
gr => gr
.Script(_customGroupIdScript)
.Order(
new TermsOrder
{
Key = "current_score",
Order = parameters.Sort.Order == Order.ASC
? appliedSort ? SortOrder.Ascending : SortOrder.Descending
: SortOrder.Descending
})
.Size(parameters.Start + parameters.Length)
.Aggregations(
aggss => aggss
.Max("current_score", tt => tt.Script("_score"))
.TopHits(
"first_elementid", tt => tt
.Source(s => s.Includes(f => f.Field("id")))
.Size(1))))
.Cardinality("totalDistinct", c => c.Script(_customGroupIdScript))
);
Спасибо!