You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:25:32