ElasticSearch 使用 Composite Aggregation 实现桶的分页查询功能

 更新时间:2024年12月12日 14:13:43   作者:小小工匠  
composite aggregation 是 Elasticsearch 中的一种特殊聚合方式,适用于需要分页展示的聚合结果,本文给大家介绍ElasticSearch 使用 Composite Aggregation 实现桶的分页查询,感兴趣的朋友一起看看吧

官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html#_pagination

概述

当需要分页查询大量的桶时composite 聚合可以通过分页的方式逐步获取桶结果,避免一次性返回大量的桶

与传统分页方法不同,composite aggregation 并不基于结果的偏移量(offset),而是基于聚合桶的游标机制来实现分页,从而避免了性能瓶颈。

Composite Aggregation 概述

composite aggregation 是 Elasticsearch 中的一种特殊聚合方式,适用于需要分页展示的聚合结果。它与传统的聚合方式不同,采用了基于游标的分页模型。composite aggregation 不依赖 fromsize 来进行分页,而是通过 after 参数来指定从某个特定桶之后开始返回数据,从而实现分页。

示例:基本分页查询

假设我们有一个索引,名称为 your_index_name,其中包含多个文档,每个文档都有一个字段 your_field_name。我们希望根据这个字段进行分页查询,并且每次返回 10 个聚合结果。

以下是一个基础的分页查询示例:

GET /your_index_name/_search
{
  "size": 0,
  "aggs": {
    "my_composite_agg": {
      "composite": {
        "size": 10, 
        "sources": [
          {
            "my_terms_agg": {
              "terms": {
                "field": "your_field_name"
              }
            }
          }
        ]
      }
    }
  }
}
  • size 设置为 0:由于我们使用的是聚合查询,而非文档查询,所以不需要返回文档内容。size: 0 意味着查询结果中不会包含文档,只会返回聚合的结果。
  • composite 聚合:这是我们实现分页的关键。composite 聚合会根据指定的聚合方式返回一个分页的桶(bucket)结果。每个桶代表了根据 your_field_name 字段分组后的数据。
  • size: 10:表示每次返回 10 个桶,即每页 10 条聚合结果。
  • sources:这是定义如何分组数据的部分。这里,我们使用了 terms 聚合,根据 your_field_name 字段的值对文档进行分组。

分页:获取下一页结果

要实现分页,我们需要使用 after 参数来指示从哪个位置开始返回数据。这个参数的值是上一个查询返回的最后一个桶的 key 值。

下面是如何获取第二页结果的示例:

GET /your_index_name/_search
{
  "size": 0,
  "aggs": {
    "my_composite_agg": {
      "composite": {
        "size": 10,
        "after": ["bucket_key_from_first_page"],  // 第一页的最后一个桶的key值
        "sources": [
          {
            "my_terms_agg": {
              "terms": {
                "field": "your_field_name"
              }
            }
          }
        ]
      }
    }
  }
}
  • after 参数:这是实现分页的关键,after 参数的值应该是上一页结果的最后一个桶的 key 值(可以通过上一页查询结果中的 after_key 获取)。after 参数告诉 Elasticsearch 从哪个位置开始返回数据,从而实现分页。
  • 获取 after_key:在每次查询的返回结果中,除了聚合的结果之外,还可以看到一个 after_key 字段,这个字段就是下一次分页查询所需要使用的 after 参数的值。

例如,假设第一次查询的返回结果包含以下聚合信息:

{
  "aggregations": {
    "my_composite_agg": {
      "buckets": [
        {
          "key": { "your_field_name": "value1" },
          "doc_count": 10
        },
        {
          "key": { "your_field_name": "value2" },
          "doc_count": 15
        },
        // ... 更多桶
      ],
      "after_key": { "your_field_name": "value2" }
    }
  }
}

在第二次分页查询时,我们需要使用 after_key 中的 your_field_name: "value2" 作为 after 参数的值,以此来获取下一页的结果。

官方案例

GET /_search
{
  "size": 0,
  "aggs": {
    "my_buckets": {
      "composite": {
        "size": 2,
        "sources": [
          { "date": { "date_histogram": { "field": "timestamp", "calendar_interval": "1d" } } },
          { "product": { "terms": { "field": "product" } } }
        ]
      }
    }
  }
}

返回

{
  ...
  "aggregations": {
    "my_buckets": {
      "after_key": {
        "date": 1494288000000,
        "product": "mad max"
      },
      "buckets": [
        {
          "key": {
            "date": 1494201600000,
            "product": "rocky"
          },
          "doc_count": 1
        },
        {
          "key": {
            "date": 1494288000000,
            "product": "mad max"
          },
          "doc_count": 2
        }
      ]
    }
  }
}

下次查询

GET /_search
{
  "size": 0,
  "aggs": {
    "my_buckets": {
      "composite": {
        "size": 2,
        "sources": [
          { "date": { "date_histogram": { "field": "timestamp", "calendar_interval": "1d", "order": "desc" } } },
          { "product": { "terms": { "field": "product", "order": "asc" } } }
        ],
        "after": { "date": 1494288000000, "product": "mad max" } 
      }
    }
  }
}

使用场景

composite aggregation 非常适用于以下场景:

  • 大量数据分页:当桶数据量非常大时,使用 composite aggregation 可以避免偏移的性能开销。
  • 基于字段的分组分页:如果需要对某个字段进行分组并进行分页,composite aggregation 是最合适的方式。
  • 避免数据丢失:使用传统分页方法时,由于数据的变动可能导致查询结果发生偏移,从而可能出现重复或遗漏的情况。composite aggregation 通过游标机制避免了这个问题。

注意事项

  • after 参数的类型:after 参数的值类型与 sources 中定义的聚合字段类型保持一致。例如,如果你的字段是字符串类型,那么 after 参数应该是字符串类型;如果是数字类型,那么应该是数字类型。
  • 分页的顺序:composite aggregation 是基于聚合桶的游标来分页的,因此分页的顺序依赖于聚合字段的值排序。如果数据分布不均,可能会导致每页的桶数不一致。
  • 限制聚合桶数:虽然可以通过 size 参数控制每页的结果数,但需要注意的是,composite aggregation 每次最多只会返回 10,000 个桶。如果你的分页范围超过这个数量,可能需要对数据进行分片或者其他优化。

到此这篇关于ElasticSearch 使用 Composite Aggregation 实现桶的分页查询的文章就介绍到这了,更多相关ElasticSearch 使用 Composite Aggregation内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在CODEIGNITER中 在CI中引入外部的JS与CSS呢

    在CODEIGNITER中 在CI中引入外部的JS与CSS呢

    其实不管是在用CI还是ZF都有同样一个问题,就是路径的问题。前期,我在用ZF做CMS时,我在.htaccess文件中设置了如遇到js,css,img等资源文件都不重定向。
    2009-07-07
  • flask+layui+echarts实现前端动态图展示数据效果

    flask+layui+echarts实现前端动态图展示数据效果

    这篇文章主要介绍了flask+layui+echarts实现前端动态图展示数据效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • fastjson到底做错了什么?为什么会被频繁爆出漏洞?(推荐)

    fastjson到底做错了什么?为什么会被频繁爆出漏洞?(推荐)

    前段时间,fastjson被爆出过多次存在漏洞,很多文章报道了这件事儿,并且给出了升级建议。本文给大家分享fastjson的releaseNote以及部分源代码。感兴趣的朋友跟随小编一起看看吧
    2020-07-07
  • C1任务01之修改游戏存档的方法

    C1任务01之修改游戏存档的方法

    这篇文章主要介绍了C1任务01之修改游戏存档的相关知识,前三个任务会用到十六进制编辑器来实现,在修改的的过程中涉及到的知识点为十进制数据与十六进制之间数据的相互转换,需要的朋友可以参考下
    2021-10-10
  • IDEA开启Run Dashboard的配置详解

    IDEA开启Run Dashboard的配置详解

    这篇文章主要介绍了IDEA开启Run Dashboard的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 如何将服务器上的python代码通过QQ发送回传信息(附实现方法)

    如何将服务器上的python代码通过QQ发送回传信息(附实现方法)

    这篇文章主要介绍了我将服务器上的python代码通过QQ发送回传信息(附实现方法),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • pycharm、idea、golang等JetBrains其他IDE修改行分隔符的详细步骤(换行符)

    pycharm、idea、golang等JetBrains其他IDE修改行分隔符的详细步骤(换行符)

    这篇文章主要介绍了pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • chatgpt国内镜像 pycharm idea插件使用详解

    chatgpt国内镜像 pycharm idea插件使用详解

    这篇文章主要介绍了chatgpt国内镜像 pycharm idea插件使用详解,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • WebStorm 2019.2安装配置方法图文教程

    WebStorm 2019.2安装配置方法图文教程

    这篇文章主要为大家详细介绍了WebStorm 2019.2安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • WebStorm打开多个项目的三种方法总结

    WebStorm打开多个项目的三种方法总结

    WebStorm支持多项目管理,本文介绍了三种方法:使用项目导航面板、窗口分割和多个WebStorm实例,项目导航面板可以在同一窗口内管理多个项目,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09

最新评论