【问题标题】:Loop through aggregations in elastic search nest c#在弹性搜索嵌套 c# 中循环遍历聚合
【发布时间】:2017-08-17 06:17:54
【问题描述】:

我想在 Elastic 中实现以下 SQL 查询的等价物:

select BookId, PubDate, count(1)
from BookMessages
where BookId in (1,2)
group by BookId, PubDate

因此我用 C# 编写了以下查询

var searchresponse = client.Search<BookMessages>(s => s
        .Query(q => q
        .Bool(bq => bq
        .Filter(fq => fq.Terms(t => t.Field(f => f.BookId).Terms(BookList)))))
         .Aggregations(a => a
         .Terms("group_by_book", ts => ts
         .Field(f => f.BookId)
             .Aggregations(a1 => a1
             .DateHistogram("Date", dat => dat
             .Field(f1 => f1.PubDate)
             .Interval(DateInterval.Day)
             .Format("dd/MM/yyyy")
         )))));

我尝试使用以下代码循环输出,但无法进一步循环。

foreach (var agg in searchresponse.Aggregations)
{
    string key = agg.Key;
    IAggregate objIAgg = agg.Value;
}

我可以在 quickwatch 中看到值,但是如何获取获得的值?

【问题讨论】:

    标签: c# elasticsearch nest elasticsearch-5 elasticsearch-net


    【解决方案1】:

    根据NEST Aggregations Documentation,您需要在结果中指定要访问的聚合。

    有两种方法可以做到这一点,通过 Aggregations 对象,就像你目前所做的那样

    IAggregate termAggregation = searchresponse.Aggregations["group_by_book"];
    

    或者您可以使用Aggs 便利助手根据键名从字典中获取正确类型的聚合响应。在这种情况下,它将从响应中公开您的条款和相关属性。

     TermsAggregate<string> termAgg = searchresponse.Aggs.Terms("group_by_book");
    

    您现在应该能够从其中任何一个中获得所需的聚合值。您可以检查这些可用的不同属性,以找到适合您的属性。

    此外,如果您查看Term Aggregations Unit tests in the NEST source code,您可以看到Aggs 属性的一些示例以及您可以访问的内容。

    【讨论】:

    • 一般来说,我建议使用 Aggs 助手,因为它会安全地执行从 IAggregate 到给定聚合的具体聚合类型的转换。
    • 非常感谢 Russ 的建议,我使用了 Aggs 助手,它对演员转换很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2018-08-06
    • 2019-04-24
    • 2018-11-05
    相关资源
    最近更新 更多