2015-01-26 6 views
4

Рассмотрим следующую агрегирования и суб агрегацию:ElasticSearch .NET Nest Sub Aggregation

.Aggregations(a => a 
         .Terms("ByCustomerByImpressionCount", tad => tad 
          .Field(o => o.CustomerName) 
          .OrderDescending("sumImpressionCount") 
          .Aggregations(ad => ad 
           .Sum("sumImpressionCount", sad => sad 
            .Field(o => o.ImpressionCount) 
           )       
          ) 
         )) 

Запрос работает нормально, и я получаю результаты.

я могу получить доступ к верхней агрегации с:

var agg = results.Aggs.Terms("ByCustomerByImpressionCount"); 

Согласно документации, я должен быть в состоянии получить суб AGG с:

var subAgg = agg.Aggs.Sum("sumImpressionCount"); 

Но Aggs даже не свойство agg - любые идеи?

EDIT:

Это единственный способ, которым я был в состоянии получить к агрегации суб:

PopulateList(results.Aggs.Terms("CustomersByImpressionCount").Items, CustomersByImpressionCount); 

private void PopulateList(IList<KeyItem> items, List<DataContainer> listToPopulate) 
{ 
       items.ForEach(item => 
       { 
        listToPopulate 
         .Add(new DataContainer() { Name = item.Key, Sum = ((ValueMetric)item.Aggregations.First().Value).Value }); 
       }); 
} 

... но это, кажется слишком сложным. Вот запрос ES:

"query": { 
    "bool": { 
     "must": [ 
     { "range": { "requestedShipDate": { 
      "gte": "2014-11-26", 
      "lte": "2015-02-03" 
     } } 

     }   
     ], 
     "must_not": [ 
     {"terms": { 
      "status": [ 
       "Order Shipped", 
       "Canceled", 
       "Completed" 
      ] 
     }} 
     ] 
    } 
    }, 
"aggs": { 
    "ByCustomerByImpressionCount": { 
     "terms": { 
     "field": "customerName", 
     "order": { "sumImpressionCount": "desc" } 
     }, 
     "aggs": { 
     "sumImpressionCount": { "sum":  { "field": "impressionCount"   }} 
     } 
    }} 

А вот частичный ответ:

"ByCustomerByImpressionCount": { 
     "doc_count_error_upper_bound": -1, 
     "sum_other_doc_count": 26785, 
     "buckets": [ 
      { 
       "key": "<One of our customers>", 
       "doc_count": 1722, 
       "sumImpressionCount": { 
        "value": 9583176 
       } 
      } 

ответ

2

документация неправильно. Мы исправим это как можно скорее.

Вот правильный способ доступа к агрегирование:

var terms = results.Aggs.Terms("ByCustomerByImpressionCount"); 

foreach(var term in terms.Items) 
{ 
    var sum = term.Sum("sumImpressionCount"); 
} 
+0

Спасибо за ответ Грег! Я попробовал ваше предложение, но теперь я получаю исключение null ref. Пожалуйста, см. Мое редактирование выше, и дайте мне знать, если это хорошее решение. –

+0

@AdamSweeney Простите, я дал вам плохой пример :). Только что отредактировал мой ответ; новый пример должен работать и упрощать вещи для вас. Надеюсь, это поможет. –

+0

термины var - тип Nest.Bucket , как я могу повторить это? –