如何在Elasticsearch中对Aggregation(聚合)进行分页?
Elasticsearch Terms聚合分页实现自动补全下拉搜索
要实现聚合结果的分页,不建议直接增大terms聚合的size值(易引发性能问题),官方推荐使用**composite聚合**来做聚合结果的游标式分页,非常适合自动补全这类需要逐步加载数据的场景。
1. 第一页查询(初始加载)
使用composite聚合定义聚合字段和每页返回的条目数,示例如下:
GET org-members/_search { "size": 0, "aggs": { "members_pagination": { "composite": { "size": 100, // 每页返回100条聚合结果,可根据需求调整 "sources": [ { "member_name": { "terms": { "field": "members.keyword", "order": { "_count": "desc" } // 和原terms聚合一致,按文档数降序排列 } } } ] } } } }
查询结果里会包含after_key字段,这是下一页查询的游标标记。
2. 后续分页查询(加载下一页)
把上一页返回的after_key值传入after参数,即可获取下一页的聚合结果:
GET org-members/_search { "size": 0, "aggs": { "members_pagination": { "composite": { "size": 100, "sources": [ { "member_name": { "terms": { "field": "members.keyword", "order": { "_count": "desc" } } } } ], "after": { "member_name": "上一页结果中最后一个成员的名称" // 替换为实际的after_key值 } } } } }
当返回结果中不再有after_key时,说明已经加载完所有聚合数据。
3. 结合自动补全的前缀过滤
如果是用户输入时的自动补全,可以在聚合里加上include参数,只返回匹配前缀的结果,减少无效数据加载:
GET org-members/_search { "size": 0, "aggs": { "members_pagination": { "composite": { "size": 100, "sources": [ { "member_name": { "terms": { "field": "members.keyword", "include": "Jo*", // 只返回以"Jo"开头的成员名称 "order": { "_count": "desc" } } } } ] } } } }
内容的提问来源于stack exchange,提问作者Jojo Joseph Kunathucherry
相关产品推荐
相关产品推荐

