Всем привет !
у меня есть тип Person, в котором есть поле GroupId, которое может быть заполненно , может быть нулевым, а так же может даже не существовать,
{
Id: 1
Name : TоTo,
GroupId: 1
}
{
Id: 2
Name : TaTo,
GroupId: 2
}
{
Id: 3
Name : ToTo,
GroupId: 2
}
{
Id: 4
Name : TaTo,
GroupId: null
}
{
Id: 5
Name : TaTa
}
Мне необхожимо отсортировать Person по имени и аггрешировать результат по группам, в которых эти люди находятся. Еаким образом человек с нулевой или несуществующей гркппой это человек который сам по себе и так же должен быть представлен в результатах
пример сортировки по имени и вывод результатов по группе 5, 2, 4, 1
Такое вообще возможно ?
Лучше всего создать еще одно поле в котором будет хранится GroupId или Id, если GroupId отсутствует. Если изменять данные не желательно, то можно воспользоваться скриптом.
Спасибо за ответ!
Я сделала скрипт прямо в агрегации и таким образом она берет либо 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))
);
Спасибо!