Upadate:
Это ответ, который я получил от Elastic Community :
С 6.x это будет что-то вроде:
var client = new ElasticClient();
var searchResponse = client.Search<object>(s => s
.Aggregations(a => a
.Terms("UnitAggregationBucket", t => t
.Field("unitId")
.Size(10)
.Order(o => o
.Descending("maximum_score")
)
.Aggregations(aa => aa
.Max("maximum_score", m => m
.Script("_score")
)
)
)
)
);
var termsAgg = searchResponse.Aggregations.Terms("UnitAggregationBucket");
foreach(var bucket in termsAgg.Buckets)
{
// do something with buckets
var maxScore = bucket.Max("maximum_score").Value;
}
Обратите внимание, что вы не можете использовать max_score для имени агрегации как
это зарезервированное ключевое слово в клиенте, которое клиент использует в
метод эвакуации, основанный на эвристике, ответ JSON метод десериализации.
Оригинальный ответ
Мне удалось написать следующий запрос NEST:
var unitAggregations = new TermsAggregation("UnitAggregationBucket")
{
Size 10,
Field = Field<MyDocument>(p => p.UnitId),
Order = new List<TermsOrder>
{
new TermsOrder()
{
Key = "max_score_in_bucket",
Order = SortOrder.Descending
}
},
Aggregations = new MaxAggregation("max_score_in_bucket", string.Empty)
{
Script = new InlineScript("_score")
}
};
Который производит следующий json:
"aggs": {
"UnitAggregationBucket": {
"aggs": {
"max_score_in_bucket": {
"max": {
"script": {
"source": "_score"
}
}
}
},
"terms": {
"field": "unitId",
"order": [
{
"max_score_in_bucket": "desc"
}
],
"size": 10
}
}
}
Это не тот JSON, который я хотел, но он делает то, что я хочу.
Примечание: max_score
- это зарезервированное ключевое слово в Elasticsearch, поэтому мне пришлось использовать другое имя: max_score_in_bucket