ElasticSearch分页技术揭秘:Composite Aggregation引领桶数据分页新时代

在Elasticsearch中,Composite Aggregation 提供了一种强大的方式来对大数据集进行分页和深度聚合,而无需将所有数据加载到内存中。这对于处理包含大量文档的数据集特别有用,因为它允许你逐步地、分页地获取聚合结果。

图片[1]_ElasticSearch分页技术揭秘:Composite Aggregation引领桶数据分页新时代_知途无界

下面是一个使用 Composite Aggregation 实现桶(buckets)分页查询的示例。

示例场景

假设你有一个包含商品信息的索引,每个商品文档都有以下字段:

  • category:商品类别
  • price:商品价格
  • name:商品名称

你想要按 category 对商品进行分组,并对每个类别中的商品按 price 进行排序,然后分页显示每个类别中的商品。

查询示例

以下是一个使用 Composite Aggregation 的查询示例,它按 category 字段对商品进行分组,并在每个类别中对商品按 price 进行排序,同时实现分页:

POST /your_index/_search
{
  "size": 0,
  "aggs": {
    "categories": {
      "composite": {
        "sources": [
          { "category": { "terms": { "field": "category.keyword" } } }
        ],
        "after": { "category": "last_seen_category_key" },  // 用于分页的游标
        "size": 10  // 每个分页返回的桶数量
      },
      "aggs": {
        "top_price_hits": {
          "top_hits": {
            "sort": [ { "price": { "order": "asc" } } ],
            "_source": { "includes": [ "name", "price" ] },
            "size": 5  // 每个类别中返回的商品数量
          }
        }
      }
    }
  }
}

参数解释

  • size: 0:因为我们只对聚合结果感兴趣,所以不需要返回任何文档。
  • aggs.categories.composite:定义了一个复合聚合。
    • sources:指定了用于分桶的字段,这里是 category
    • after:用于分页的游标,初始查询时可以省略或设置为 null。在后续的分页查询中,应该设置为上一次查询结果中返回的最后一个桶的键(key)。
    • size:每个分页返回的桶数量。
  • aggs.categories.aggs.top_price_hits:在每个类别桶内,使用 top_hits 聚合来获取按 price 排序的商品信息。
    • sort:指定排序字段和顺序。
    • _source:指定返回的字段。
    • size:每个类别中返回的商品数量。

分页查询

为了实现分页,你需要保存上一次查询结果中返回的最后一个桶的键(key),并在下一次查询时将其作为 after 参数的值传递。Elasticsearch 会从该桶的下一个桶开始返回结果。

注意事项

  • Composite Aggregation 是 Elasticsearch 6.1 及更高版本中引入的功能。
  • 当你使用 Composite Aggregation 进行分页时,请确保你的查询是幂等的,即相同的查询在多次执行时应该返回相同的结果(假设数据没有变化)。
  • 如果你的数据集非常大,请考虑使用合适的分页大小(size 参数)和适当的硬件资源来优化性能。

通过上述方法,你可以使用 Composite Aggregation 在 Elasticsearch 中实现桶的分页查询功能。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞43 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容