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

文章目录

  • 官方文档
  • 概述
  • 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"
              }
            }
          }
        ]
      }
    }
  }
}
  1. size 设置为 0:由于我们使用的是聚合查询,而非文档查询,所以不需要返回文档内容。size: 0 意味着查询结果中不会包含文档,只会返回聚合的结果。

  2. composite 聚合:这是我们实现分页的关键。composite 聚合会根据指定的聚合方式返回一个分页的桶(bucket)结果。每个桶代表了根据 your_field_name 字段分组后的数据。

  3. size: 10:表示每次返回 10 个桶,即每页 10 条聚合结果。

  4. 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"
              }
            }
          }
        ]
      }
    }
  }
}
  1. after 参数:这是实现分页的关键,after 参数的值应该是上一页结果的最后一个桶的 key 值(可以通过上一页查询结果中的 after_key 获取)。after 参数告诉 Elasticsearch 从哪个位置开始返回数据,从而实现分页。

  2. 获取 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 非常适用于以下场景:

  1. 大量数据分页:当桶数据量非常大时,使用 composite aggregation 可以避免偏移的性能开销。

  2. 基于字段的分组分页:如果需要对某个字段进行分组并进行分页,composite aggregation 是最合适的方式。

  3. 避免数据丢失:使用传统分页方法时,由于数据的变动可能导致查询结果发生偏移,从而可能出现重复或遗漏的情况。composite aggregation 通过游标机制避免了这个问题。


注意事项

  1. after 参数的类型after 参数的值类型与 sources 中定义的聚合字段类型保持一致。例如,如果你的字段是字符串类型,那么 after 参数应该是字符串类型;如果是数字类型,那么应该是数字类型。

  2. 分页的顺序composite aggregation 是基于聚合桶的游标来分页的,因此分页的顺序依赖于聚合字段的值排序。如果数据分布不均,可能会导致每页的桶数不一致。

  3. 限制聚合桶数:虽然可以通过 size 参数控制每页的结果数,但需要注意的是,composite aggregation 每次最多只会返回 10,000 个桶。如果你的分页范围超过这个数量,可能需要对数据进行分片或者其他优化。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936225.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微积分复习笔记 Calculus Volume 2 - 3.7 Improper Integrals

3.7 Improper Integrals - Calculus Volume 2 | OpenStax

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点:变量的作用域和生存期 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组,内放 10 个学生成绩,写一个函数,求出平均分、最高分和最低分。 任务要求用一个函数来完…

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档: https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…

2024.12.10——攻防世界Web_php_include

知识点:代码审计 文件包含 伪协议 伪协议知识点补充: 在PHP中,伪协议(Pseudo Protocols)也被称为流包装器,这些伪协议以 php://开头,后面跟着一些参数,用于指定要执行的操作或需要…

Wireshark如何查看数据包时间间隔

1.如果数据包量不大&#xff0c;抓包本身也不大&#xff0c;建议从绝对时间判断&#xff0c;打开wireshark软件&#xff0c;并点开相应要分析的抓包文件。 进入到最上方菜单<视图>,在弹出菜单选择时间显示格式&#xff0c;再在右侧菜单中选择自捕获经过的秒数。 这样就可…

【ChatGPT】解锁AI思维链:如何让机器像人类一样思考?

在人工智能领域&#xff0c;我们一直在追求让机器像人类一样思考。然而&#xff0c;即使是最先进的AI&#xff0c;也常常被诟病缺乏“常识”&#xff0c;难以理解复杂问题&#xff0c;更不用说像人类一样进行逻辑推理和解决问题了。最经常的表现就是遇到不会的地方&#xff0c;…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

FinClip | 2024年11月产品大事记

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在11月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中&#xff0c;主机通常通过默认网关进行网络通信。当默认网关出现故障时&#xff0c;网络通信会中断&#xff0c;影响业务连续性和稳定性。为了提高网络的可靠性和冗余性&#xff0c;采用虚拟路由冗余协议&#xff08;VRRP&#xff09;是一种…

安卓主板_MTK联发科android主板方案

在当前智能设备的发展中&#xff0c;安卓主板的配置灵活性和性能优化显得尤为重要。安卓主板的联发科方案&#xff0c;在芯片上&#xff0c;搭载联发科MTK6761、MT8766、MT6765、MT6762、MT8768、MT8390、MTK8370以及MT8788等型号&#xff0c;均基于64位的四核或八核架构设计。…

【论文阅读】PRIS: Practical robust invertible network for image steganography

内容简介 论文标题&#xff1a;PRIS: Practical robust invertible network for image steganography 作者&#xff1a;Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间&#xff1a;2024年4月11日 Engineering Applications of Artificial Intelligence 关键…

Redis应用—1.在用户数据里的应用

大纲 1.社区电商的业务闭环 2.Redis缓存架构的典型生产问题 3.用户数据在读多写少场景下的缓存设计 4.热门用户数据的缓存自动延期机制 5.缓存惊群与穿透问题的解决方案 6.缓存和数据库双写不一致问题分析 7.基于分布式锁保证缓存和数据库双写一致性 8.缓存和数据库双写…

【Tomcat】理解tomcat与Socket

目录 1. Tomcat 1.1 Tomcat帮助启动http服务器。 1.2 tomcat理解&#xff1a; 2. 计算机网络最基本的流程 2.1 信息是怎么来的&#xff1f; 2.2 端口是干什么的&#xff1f; 3. 简单的Socket案例 服务端 客户端 启动&#xff1a; 3.2 在Tomcat发送信息&#xff0c;看…

Linux / Windows | ping IP + Port 测试

注&#xff1a;本文为 “Linux / Windows | ping IP Port 测试端口通畅” 相关文章合辑。 未整理去重。 windows 如何确认服务器上程序端口是否正常&#xff08;ping、tcping&#xff09; 三希已于 2023-05-22 18:08:06 修改 方式 1&#xff1a;ping 命令 ping 命令说明 p…

计算机网络之网络层超详细讲解

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之网络层超详细讲解 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …

LLMC:大语言模型压缩工具的开发实践

关注&#xff1a;青稞AI&#xff0c;学习最新AI技术 青稞Talk主页&#xff1a;qingkelab.github.io/talks 大模型的进步&#xff0c;正推动我们向通用人工智能迈进&#xff0c;然而庞大的计算和显存需求限制了其广泛应用。模型量化作为一种压缩技术&#xff0c;虽然可以用来加速…

jvm内存优化方式

1. JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a; • 定义&#xff1a;Java虚拟机&#xff0c;是运行Java字节码的抽象计算机。 • 内存管理&#xff1a;负责内存的分配和回收&#xff0c;是JVM内存优化的核心。 2. 堆&#xff08;Heap&#xff09;&#xff1a…

360智脑张向征:共建可信可控AI生态 应对大模型安全挑战

发布 | 大力财经 人工智能的加速发展&#xff0c;有力推动了社会的数智化转型&#xff1b;与此同时&#xff0c;带来的相关安全风险也日益凸显。近日&#xff0c;在北京市举办的通明湖人工智能开发与应用大会上&#xff0c;360智脑总裁张向征以“大模型安全研究与实践”为主题&…

CNCF云原生生态版图-分类指南(三)- 运行时

CNCF云原生生态版图-分类指南&#xff08;三&#xff09;- 运行时 CNCF云原生生态版图-分类指南三、运行时&#xff08;Runtime&#xff09;&#xff08;一&#xff09;云原生存储&#xff08;Cloud Native Storage&#xff09;1. 是什么&#xff1f;2. 解决什么问题&#xff1…

【实验】基于双向LSTM和注意力机制的文本分类

目录 1 数据 2 模型构建 2.1 注意力打分函数 2.1.1 加性模型 2.1.2 点积模型 2.2 注意力分布计算 2.3 加权平均 2.4 完整注意力机制的实现 2.4 模型汇总 3 模型训练 3.1 使用加性注意力模型 3.2 使用点积注意力模型 4 模型评价 4.1 使用加性注意力模型 4.2 使用点…