Elasticsearch聚合后将聚合结果进行分页的解决办法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch聚合后将聚合结果进行分页的解决办法相关的知识,希望对你有一定的参考价值。
参考技术A PS:我使用的 ES版本是7.9.2
如题:最近遇到类似需求,需要将terms聚合的结果以列表形式分页展示。
按job分桶聚合
利用bucket_sort实现分页
注意:
可以看到实现了分页的效果,但是新的问题出现了,没有total的话前端很多分页插件效果都不好,查询相关文档,cardinality类似SQL中distinct某个字段后,再count,于是使用cardinality获取相关聚合结果的total:
这里简单介绍一下 precision_threshold
摘抄官网的原文:
The precision threshold options allows to trade memory for accuracy, and defines a unique count below which counts are expected to be close to accurate. Above this value, counts might become a bit more fuzzy. The maximum supported value is 40000, thresholds above this number will have the same effect as a threshold of 40000. The default value is 3000.
翻译:
精度阈值选项允许用内存交换精度,并定义了一个唯一的计数,在该计数低于此值时,预计计数接近准确。超过这个值,计数可能会变得有点模糊。支持的最大值是40000,高于这个数字的阈值将具有与40000阈值相同的效果。缺省值为3000。
result3中termsCount就是我们想要得到的total。
以上就是我对terms聚合后再对其聚合结果进行分页的解决办法,如果大家有其他更好的办法,也请分享出来。
如果觉得本文有帮助到你,请给我点个赞吧!
PS:如果需要在此基础上支持搜索功能,请移步 Elasticsearch聚合结果分页并支持之模糊查询
滚动或分页 Elasticsearch 聚合 - Nest 框架
【中文标题】滚动或分页 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聚合后将聚合结果进行分页的解决办法的主要内容,如果未能解决你的问题,请参考以下文章