滚动或分页 Elasticsearch 聚合 - Nest 框架

Posted

技术标签:

【中文标题】滚动或分页 Elasticsearch 聚合 - Nest 框架【英文标题】:Scrolling or Pagination Elasticsearch Aggregations - Nest Framework 【发布时间】:2022-01-15 16:55:57 【问题描述】:

我的 Elasticsearch 文档如下所示;我在 60 秒间隔的桶中创建了一个平均聚合


"version" : 4,
"metric1" : 0.688872,
"metric2" : 0.021005,
"metric3" : 0.578913,
"metric4" : 71.57523,
"metric5" : 10.71166,
"Agentid" : "12345",
"epoch" : 1638173827064

我的聚合代码如下所示;

var response = await _client.SearchAsync<MyPOCO>(s => s
                                        .Index(indexName)
                                        .TrackTotalHits(true)
                                        .Size(0)
                                        .Query(q => q
                                                .Bool(b => b
                                                    .Must(mu => mu
                                                        .Match(m => m
                                                            .Field("AgentId")
                                                            .Query(Convert.ToString(AgentId))
                                                        )
                                                    )
                                                    .Filter(fi => fi
                                                        .DateRange(r => r
                                                            .Field("epoch")
                                                            .GreaterThanOrEquals(Convert.ToString(StartTime))
                                                            .LessThan(Convert.ToString(EndTime))
                                                            .Format("epoch_millis")
                                                        )
                                                    )
                                                )
                                            )
                                        .Aggregations(a => a
                                        .DateHistogram("metricsperminute", ab => ab
                                             .Field("ts")
                                             .FixedInterval("1m")
                                             .Aggregations(x => x
                                                    .Average("metric1", m => m
                                                        .Field(o => o.metric1)
                                                    )
                                                    .Average("metric2", n => n
                                                        .Field(o => o.metric2)
                                                    )
                                                    .Average("metric3", o => o
                                                        .Field(o => o.metric4)
                                                    )
                                                    .Average("metric5", p => p
                                                        .Field(o => o.metric5)
                                                    )
                                            )))
                                        .Sort(sort => sort.Ascending("epoch")));

我对如何在聚合中获取超过 10k 条记录/存储桶有点迷茫?如何进行分页或滚动?请帮忙。

【问题讨论】:

【参考方案1】:

有一个search.max_buckets 动态集群设置,但我会尽量避免一次返回太多存储桶。太慢了

【讨论】:

感谢 ilvar - 但由于性能问题,我不希望选择 search.max_buckets 选项。我想做的是以某种方式分页或移动到下一组存储桶 恐怕你做不到。另一种选择是尝试在索引管道中或作为常规 cron 作业计算聚合数据(例如更新指标累加器和计数器)。然后,您将拥有一个包含准备好的数据的单独索引,并且可以轻松滚动浏览它(并且性能将明显优于 aggs!)

以上是关于滚动或分页 Elasticsearch 聚合 - Nest 框架的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch聚合后分页

Elasticsearch聚合后分页深入详解

Composite 聚合——Elasticsearch 聚合后分页新实现

在 ElasticSearch 6 中按子聚合过滤、排序和分页

ElasticSearch条件查询聚合分页mapping

ElasticSearch条件查询聚合分页mapping