当前位置: 首页 > article >正文

ES-深度分页问题

ES分页查询基本语法

# 分页
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": "asc"
    }
  ],
  "from": 0,
  "size": 10
}

上面是ES查询hotel这个索引库的语句,其中做了分页查询,from是从第几条数据开始(默认为0),size是每页展示的条数
我们可以类比一下mysql查询语句

SELECT * FROM hotel LIMIT 0, 10;

深度分页

什么是深度分页

在 Elasticsearch(ES)中,深度分页是指从大量的搜索结果中获取较靠后的页面数据。例如,当用户请求查询结果的第 100 页,每页显示 10 条记录,这就涉及到深度分页。
通常,在 ES 中,查询是分布式的,数据存储在多个分片(shard)上。当进行分页查询时,每个分片都要返回自己的一部分结果,然后在协调节点(coordinating node)进行汇总排序,得到最终的结果集。

深度分页的问题

  1. 性能问题
    随着分页深度的增加,需要从更多的分片中获取数据。ES 需要检索大量的文档,对这些文档进行排序和筛选,这会消耗大量的内存和 CPU 资源。
    例如,假设一个索引有 10 个分片,查询从990开始(每页 10 条记录),ES 可能需要在每个分片上检索 1000 多条记录(因为要考虑排序等因素),总共要检索 10000 多条记录,只是为了获取最后的 10 条记录用于第 100 页的展示。
    在这里插入图片描述
  2. 准确性问题(近似计数)
    当进行深度分页时,ES 为了性能考虑,可能会使用近似计数而不是精确计数。这是因为精确计算会带来更高的成本。
    比如,在计算总命中数(total hits)时,对于深度分页的情况,ES 可能会返回一个近似值。这对于一些需要精确统计结果数量的应用场景可能会产生问题。
    为此es限制查询条数不超过10000条

解决方案和替代策略

  1. 使用滚动查询(Scroll API)
    滚动查询适用于需要对大量数据进行深度遍历的场景,而不是传统的分页场景。它允许用户在一个初始请求之后,通过一个滚动 ID(scroll ID)不断地获取下一批数据,直到所有数据都被检索完。
    例如,在处理大数据集的导出或全量数据处理时,可以使用滚动查询。但要注意,滚动查询会占用一定的资源,并且在查询期间,ES 会保持一个上下文环境,所以应该在合适的场景下使用。
  2. 限制分页深度
    在实际应用中,可以通过业务规则限制用户能够请求的最大分页深度。例如,只允许用户查询前 10 页的内容,这样可以避免过度的深度分页,减少性能问题。
  3. 使用 search_after 参数
    search_after 是一种替代传统分页方式的方法。它基于上一次查询的结果来获取下一批次的结果。与传统分页不同的是,它不需要计算前面所有页的结果,只需要知道上一次查询的最后一个文档的排序值。
    例如,假设查询结果是按照时间戳排序的,在第一次查询中获取了前 10 条记录,记录下最后一条记录的时间戳,然后在下次查询中,通过 search_after 参数传入这个时间戳,就可以获取下一批记录。这种方式在一定程度上缓解了深度分页的性能问题。

http://www.kler.cn/a/468496.html

相关文章:

  • GoFrame 基础入门
  • Java中的CAS操作是什么?它如何实现无锁编程?
  • 鸿蒙操作系统(HarmonyOS)
  • taro转H5端踩坑
  • 用户界面的UML建模10
  • Transformer知识梳理
  • LeetCode题练习与总结:随机翻转矩阵--519
  • 使用FDBatchMove的几个问题总结
  • 数据结构:ArrayList与顺序表
  • 每日一学——日志管理工具(Graylog)
  • C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)
  • 主从复制(Redis的特性)
  • 深入探索 Kubernetes:从基础概念到实战运维
  • 复杂对象的创建与组装 - 建造者模式(Builder Pattern)
  • flutter在windows平台中运行报错
  • BOOST 库在机器视觉中的应用及示例代码分析
  • 【C++】B2099 矩阵交换行
  • 基于 GitHub Actions 的流程自动化实践
  • Apache Traffic存在SQL注入漏洞(CVE-2024-45387)
  • 感冒之嗓子红肿,咽红且痛,微恶风寒,无浑身疼痛,无清鼻涕
  • Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)
  • Python爬虫基础——requests模块
  • Harmony OS开发-ArkTS语言速成五
  • 嵌入式Linux(二)·配置VMware使用USB网卡连接STM32MP157实现Windows、Ubuntu以及开发板之间的通信
  • 基于海思soc的智能产品开发(camera sensor的两种接口)
  • React中的合成事件