如何为 'next 7 days' 进行 ElasticSearch 日期直方图聚合
How to do an ElasticSearch date historgram aggregation for 'next 7 days'
我想在日期字段上使用 ElasticSearch 聚合,其中每个 'bucket' 都是该日期的值。
我是从这个开始的:
"aggs" : {
"auctions" : {
"date_histogram" : {
"field" : "auctionOn",
"interval" : "day"
}
}
}
但是 returns 桶太多了。我只想要接下来 7 天的桶。
我还有一堆其他的聚合,所以过滤器只需要应用到这个聚合。
有什么想法吗?
我也在使用 .NET 的 NEST 客户端,所以如果你能帮我弄清楚如何使用 NEST 客户端,我会很高兴(但我应该能够弄清楚,一旦我有了 ES查询使用)
谢谢
您可以在 filter
聚合中使用 date_histogram
聚合来为特定聚合应用过滤器。
所以聚合看起来像:
{
"aggs": {
"filter_hist": {
"filter": {
"range": {
"auctionOn": {
"gte": "2018-12-01",
"lte": "2018-12-21"
}
}
},
"aggs": {
"hist": {
"date_histogram": {
"field": "auctionOn",
"interval": "1d"
}
}
}
}
}
}
您可以根据需要更改 range
过滤器。
执行此操作的方法是对日期字段应用 range
查询,该查询将在计算聚合之前应用。
虽然听起来您在一个请求中执行多个聚合,但此日期范围应仅应用于一个聚合,因此您可以执行 msearch
or multi search 以在一个请求中检索多个结果。例如,这就是 Kibana 用于在仪表板中检索多个可视化结果的方法。
类似
public class MyDocument
{
public string Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime AuctionOn { get; set; }
}
var client = new ElasticClient();
var multiSearchResponse = client.MultiSearch(ms => ms
.Search<MyDocument>("main_aggs", s => s
.Aggregations(a => a
.Terms("titles", t => t
.Field(f => f.Title)
)
.Terms("content", t => t
.Field(f => f.Content)
)
)
)
.Search<MyDocument>("date_agg", s => s
.Query(q => q
.DateRange(dr => dr
.Field(f => f.AuctionOn)
.GreaterThanOrEquals(DateMath.Now)
.LessThan(DateMath.Now.Add("7d"))
)
)
.Aggregations(a => a
.DateHistogram("auctions", dh => dh
.Field(f => f.AuctionOn)
.Interval(DateInterval.Day)
)
)
)
);
var mainAggsResponse = multiSearchResponse.GetResponse<MyDocument>("main_aggs");
var dateAggResponse = multiSearchResponse.GetResponse<MyDocument>("date_agg");
我想在日期字段上使用 ElasticSearch 聚合,其中每个 'bucket' 都是该日期的值。
我是从这个开始的:
"aggs" : {
"auctions" : {
"date_histogram" : {
"field" : "auctionOn",
"interval" : "day"
}
}
}
但是 returns 桶太多了。我只想要接下来 7 天的桶。
我还有一堆其他的聚合,所以过滤器只需要应用到这个聚合。
有什么想法吗?
我也在使用 .NET 的 NEST 客户端,所以如果你能帮我弄清楚如何使用 NEST 客户端,我会很高兴(但我应该能够弄清楚,一旦我有了 ES查询使用)
谢谢
您可以在 filter
聚合中使用 date_histogram
聚合来为特定聚合应用过滤器。
所以聚合看起来像:
{
"aggs": {
"filter_hist": {
"filter": {
"range": {
"auctionOn": {
"gte": "2018-12-01",
"lte": "2018-12-21"
}
}
},
"aggs": {
"hist": {
"date_histogram": {
"field": "auctionOn",
"interval": "1d"
}
}
}
}
}
}
您可以根据需要更改 range
过滤器。
执行此操作的方法是对日期字段应用 range
查询,该查询将在计算聚合之前应用。
虽然听起来您在一个请求中执行多个聚合,但此日期范围应仅应用于一个聚合,因此您可以执行 msearch
or multi search 以在一个请求中检索多个结果。例如,这就是 Kibana 用于在仪表板中检索多个可视化结果的方法。
类似
public class MyDocument
{
public string Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime AuctionOn { get; set; }
}
var client = new ElasticClient();
var multiSearchResponse = client.MultiSearch(ms => ms
.Search<MyDocument>("main_aggs", s => s
.Aggregations(a => a
.Terms("titles", t => t
.Field(f => f.Title)
)
.Terms("content", t => t
.Field(f => f.Content)
)
)
)
.Search<MyDocument>("date_agg", s => s
.Query(q => q
.DateRange(dr => dr
.Field(f => f.AuctionOn)
.GreaterThanOrEquals(DateMath.Now)
.LessThan(DateMath.Now.Add("7d"))
)
)
.Aggregations(a => a
.DateHistogram("auctions", dh => dh
.Field(f => f.AuctionOn)
.Interval(DateInterval.Day)
)
)
)
);
var mainAggsResponse = multiSearchResponse.GetResponse<MyDocument>("main_aggs");
var dateAggResponse = multiSearchResponse.GetResponse<MyDocument>("date_agg");