我想要为每个unitId
(这是我的文档中的一个字段)创建一个聚合存储桶。我希望每个存储桶都按照该存储桶中的最高得分排序。我写了下面的查询,该查询可以满足我的要求:
"aggs": {
"UnitAggregationBucket": {
"terms": {
"field": "unitId",
"size": 10,
"order": {
"max_score": "desc"
}
},
"aggs": {
"max_score": {
"max": {
"script": "_score"
}
}
}
}
我正在使用脚本在子聚合中查找每个存储桶的最高得分。我不知道如何使用NEST编写上述查询?
答案 0 :(得分:0)
这是我从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