Я использую составные и термины агрегации для получения сгруппированных результатов на основе заданного поля. Я также использую агрегирование Cardinality для получения общего количества сегментов агрегации.
Ниже приведен мой запрос, который я отправляю для получения соответствующего ответа:
Request :
"aggs": {
"myfield_comp_agg": {
"aggs": {
"myfield": {
"aggs": {
"myfield_tophits": {
"top_hits": {
"size": 1
}
}
},
"terms": {
"field": "myfield",
"size": 10
}
}
},
"composite": {
"after": {
"myfield_comp_terms_agg": ""
},
"sources": [
{
"myfield_comp_terms_agg": {
"terms": {
"field": "myfield"
}
}
}
]
}
},
"Count_agg": {
"cardinality": {
"field": "myfield"
}
}
}
Ответ :
{
...,
"aggregations" : {
"Count_agg" : {
"value" : 33
},
"myfield_comp_agg" : {
"after_key" : {
"myfield_comp_terms_agg" : "value10"
},
"buckets" : [
{
"key" : {
"DocId_comp_terms_agg" : "value1"
},
"doc_count" : 1,
"DocId" : {...}
},
{...},
{...},
{...}
]
}
}
}
Я использовал Kibana для проверки запроса, и он отлично работает для меня.
Однако Я не уверен, как использовать этот агрегатор кардинальности в моем синтаксисе объекта NEST.
Вот мой код:
var termsAggregation = new TermsAggregation(GetTermsAggregationName(aggregationField)) {
Field = aggregationField,
Size = takeCount
};
var topHitsAggregation = new TopHitsAggregation(GetTopHitsAggregationName(aggregationField)) {
Size = aggregationFieldCount
};
var termsAggregationContainer = new AggregationContainer {
Terms = termsAggregation,
Aggregations = topHitsAggregation
};
var subAggregations = new Dictionary<string, IAggregationContainer>() {
{ aggregationField, termsAggregationContainer}
};
var compositeKey = new Dictionary<string, object>() {
{ GetCompositeTermsAggregationName(aggregationField), aggregationSkipValue }
};
var termsSource = new TermsCompositeAggregationSource(GetCompositeTermsAggregationName(aggregationField)) {
Field = aggregationField
};
var compositeAggregation = new CompositeAggregation(GetCompositeAggregationName(aggregationField)) {
After = new CompositeKey(compositeKey),
Sources = new List<TermsCompositeAggregationSource> { termsSource },
Aggregations = subAggregations
};
var searchRequest = new SearchRequest(request.IndexName)
{
From = request.SkipCount,
Size = request.TakeCount
};
searchRequest.Aggregations = compositeAggregation;
ElasticSearchClient.Search<T>(searchRequest);
Я был бы очень признателен за любую помощь.