在C#中使用Elasticsearch Nest遍历聚合

3

我希望在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;
}

我可以在快速查看中看到这些值,但我怎样获取这些值?
1个回答

3
根据NEST聚合文档,您需要在结果中指定要访问的聚合。有两种方法可以做到这一点,一种是通过Aggregations对象,就像您当前所做的那样。
IAggregate termAggregation = searchresponse.Aggregations["group_by_book"];

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

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

现在你应该能够从它们中的任何一个获取所需的聚合值。你可以检查这些可用属性,找到适合你的正确属性。

此外,如果你查看NEST源代码中的Term Aggregations Unit tests,你可以看到一些Aggs属性的示例以及你可以访问的内容。


1
一般来说,我建议使用 Aggs 助手,因为它可以安全地执行从 IAggregate 到给定聚合的具体聚合类型的转换。 - Russ Cam
非常感谢Russ的建议,我使用了Aggs助手,它对于类型转换非常有帮助。 - Hitesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接