【问题标题】:ElasticSearch .NET Nest Sub AggregationElasticSearch .NET 嵌套子聚合
【发布时间】:2015-03-25 01:42:33
【问题描述】:

考虑以下聚合和子聚合:

.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 的属性 - 有什么想法吗?

编辑:

这是我能够进入子聚合的唯一方法:

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
               }
            }

【问题讨论】:

    标签: elasticsearch aggregation nest


    【解决方案1】:

    文档有误。我们会尽快解决这个问题。

    这是访问聚合的正确方法:

    var terms = results.Aggs.Terms("ByCustomerByImpressionCount");
    
    foreach(var term in terms.Items)
    {
        var sum = term.Sum("sumImpressionCount");
    }
    

    【讨论】:

    • 感谢格雷格的回复!我尝试了你的建议,但现在我得到了一个空引用异常。请查看我上面的编辑,如果这是一个好的解决方案,请告诉我。
    • @AdamSweeney 对不起,我给了你不好的例子:)。刚刚编辑了我的答案;新示例应该可以为您工作并简化一些事情。希望对您有所帮助。
    • term var 是 Nest.Bucket 类型,我该如何迭代呢?
    • 哦,对不起。条款。项目!
    猜你喜欢
    • 2021-12-14
    • 2015-11-18
    • 1970-01-01
    • 2017-07-12
    • 2018-01-30
    • 2015-07-30
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多