在弹性搜索嵌套 c# 中循环遍历聚合
Loop through aggregations in elastic search nest c#
我想在 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 中看到这些值,但是如何获取获得的值?
根据 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
属性 的一些示例以及您可以访问的内容。
我想在 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 中看到这些值,但是如何获取获得的值?
根据 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
属性 的一些示例以及您可以访问的内容。