Elasticsearch 2.3版本下聚合查询如何实现分页?附查询语句
Elasticsearch 2.3 聚合分页实现方案
当然可以在Elasticsearch 2.3版本中结合聚合实现分页!不过要注意,2.3版本的聚合分页逻辑和后续高版本(比如引入composite聚合的5.x+版本)有所不同,咱们针对你当前的查询场景来一步步说明。
核心思路
你的查询是基于clientMac.rawData做terms聚合,每个桶内取最新的一条event_timestamp数据。要实现聚合的分页,本质上是对这些terms桶进行分页——也就是每次返回指定数量的桶,而非一次性获取所有结果。
在ES2.3中,terms聚合支持通过from和size参数来控制桶的分页:
size:指定每页返回的桶数量from:指定从第几个桶开始返回(从0开始计数)
修改后的分页查询示例
假设你想每页返回10个桶,第一页的查询可以这么写:
{ "query": { "match": { "clientMac": "88:" } }, "aggs": { "top_tags": { "terms": { "field": "clientMac.rawData", "size": 10, // 每页返回10个桶 "from": 0 // 第一页从第0个桶开始 }, "aggs": { "top_client_hits": { "top_hits": { "sort": [ { "event_timestamp": { "order": "desc" } } ], "_source": { "includes": [ "event_timestamp" ] }, "size": 1 } } } } } }
如果要获取第二页,只需要把from的值改成10,第三页改成20,以此类推。
注意事项
- 性能限制:这种
from+size的分页方式,ES需要先在协调节点上聚合所有分片的桶结果,排序后再截取指定范围的数据。如果你的桶数量非常大(比如超过1万),会占用较多内存,性能会明显下降。 - 参数限制:ES默认的
index.max_result_window参数值是10000,如果你需要分页到超过10000个桶之后,需要调整这个参数,但不建议这么做——这会进一步增加内存压力。 - 替代方案(局限性):如果桶数量极大,你可以尝试用
terms聚合的include/exclude参数做前缀分页(比如只返回以特定前缀开头的clientMac.rawData桶),但这种方式要求你的聚合字段有规律的前缀,适用性比较窄。
内容的提问来源于stack exchange,提问作者Daoud Shaheen
相关产品推荐
相关产品推荐

