es--Elastic Search深度分页问题分析及四种解决方案

这篇具有很好参考价值的文章主要介绍了es--Elastic Search深度分页问题分析及四种解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 简介

​ Elasticsearch的深度分页是指当你需要查询的结果数量非常多时,需要分页查询的第n页时,每次查询都需要扫描前n-1页的数据来获取结果。这样会导致性能问题,因为它需要很长的时间来完成查询。

2. 解决方案

  1. Scroll API: Scroll API可以让你在每个查询阶段中存储状态。这样,你就不需要从头开始查询,而只需要继续上一次的查询。使用Scroll API可以避免深度分页的开销,并且可以更好地管理内存。
  2. Search After: Search After是一种基于游标的分页方案,它使用最后一个结果的位置作为游标位置,从而避免使用_from_和_size_参数。
  3. Time-Based Pagination: 在特定情况下,你可以使用基于时间的分页方案来避免深度分页问题。例如,当你需要按照日期或时间戳排序时,你可以使用基于时间的分页。
  4. Shard-Based Pagination: 当你需要对分布式数据进行深度分页时,你可以使用基于分片的分页方案。这种方案将搜索分解成多个分片,然后对每个分片进行分页查询,最后将结果聚合在一起。

3. scoroll API

3.1 简介

Scroll API是Elasticsearch提供的一种用于深度分页的解决方案。它允许您从数据集中获取大量数据而不会使用过多的资源。

Scroll API通过分批次读取数据,将查询拆分为多个小块,并在每个小块完成后将其提交到Web浏览器。这意味着您可以一次性检索大量文档,而不必担心过多的资源使用和系统崩溃。

3.2 实现方式

  1. 使用search API对数据进行初始查询,并提供scroll参数,该参数指定滚动时间的长度。
  2. Elasticsearch返回一个scroll_id,该ID用于检索下一批数据。
  3. 使用scroll API检索下一批数据,并将scroll_id作为参数传递。
  4. 重复步骤3,直到所有数据都已检索。
  5. 最后使用clear_scroll API来清除滚动上下文。

3.3 注意

使用Scroll API,您可以检索大量数据而不必担心内存使用问题,因为每个请求都只需要在内存中保存一小部分数据。然而,它也有一些限制,如延迟和限制的滚动ID的数量。

4. Search After

4.1 简介

Search After是Elasticsearch提供的另一种用于深度分页的解决方案。它允许您非常快速地检索大量数据并避免使用scroll API。

Search After需要使用排序字段和排序方向,以及最后一条记录的值来获取下一个分页。排序字段必须是唯一的,并且必须被所有文档定义。

4.2 实现方式

  1. 使用search API对数据进行初始查询,并指定排序字段和排序方向。
  2. 从响应中获取最后一条记录的排序字段值。
  3. 使用search after参数检索下一批数据,并将之前获取的排序字段值作为参数传递。
  4. 重复步骤2和3,直到所有数据都已检索。

4.3 注意

使用Search After可以减少内存的使用,因为它不需要使用滚动上下文来存储结果。此外,它通过使用排序字段和排序方向来使性能得到了优化。

但是,与scroll API不同,Search After需要您手动迭代页面,并且需要在每个页面上进行额外的查询。此外,如果数据集中有多个文档具有相同的排序字段值,则可能会出现一些问题。

5. Time-Based Pagination

5.1 简介

Time-Based Pagination (基于时间的分页)是一种解决深度分页问题的方案,它的核心思想是根据时间进行分页。在这种方案中,每个页面都是根据创建时间、修改时间或更新时间进行排序的,然后按照时间范围进行分页。这种分页方案的好处是可以减少数据库的查询负荷,同时保障页面的加载速度。

5.2 实现方式

基于时间的分页可以采用两种方式进行实现:一种是使用时间戳,另一种是使用时间范围

使用时间戳进行分页,即将每条数据的时间戳作为页面中的唯一标识,根据时间戳对数据进行排序,然后根据时间戳进行分页。这种方式的优势在于它非常简单,但缺点是需要使用唯一的时间戳来对每个数据进行排序,这往往需要占用大量的存储空间。

使用时间范围进行分页,即将时间区间作为页面的唯一标识,根据时间范围对数据进行排序,然后根据时间范围进行分页。这种方式的优势在于它可以减少存储空间的占用,但缺点是需要使用更复杂的算法来对数据进行排序,并且需要处理时间范围的交叉和重叠问题。

5.3 注意

无论是使用时间戳还是使用时间范围进行分页,都需要注意数据的时区,因为不同的时区可能会导致数据排序不一致。另外,为了提高查询效率,也可以使用缓存和索引优化技术来优化分页查询。

6. Shard-Based Pagination

6.1 简介

Shard-Based Pagination是一种深度分页解决方案,可以减轻单个查询处理所有数据的负担。该方案建议使用分布式数据库或搜索引擎系统,并将数据按照一定的规则分成多个分片存储。当需要进行深度分页查询时,只查询需要的分片数据,减少了单个查询处理数据量的负担。

6.2 实现方式

  1. 将数据根据一定的规则分片存储,例如按时间、地理位置、用户ID等。
  2. 对于需要进行深度分页查询的请求,根据查询条件确定需要查询的分片数据。
  3. 对于每个分片数据,使用常规的分页方法进行查询。
  4. 将分页结果按照查询条件合并,得到最终的查询结果。

6.3 注意

需要注意的是,Shard-Based Pagination需要在数据存储时进行分片,因此需要考虑好数据结构和分片规则,避免出现数据分散不均的情况。同时,分片的实现也需要保证数据的一致性和可靠性。

总的来说,Shard-Based Pagination是一种有效解决深度分页查询性能问题的方案,可以较好地应对大量数据查询的需求。文章来源地址https://www.toymoban.com/news/detail-715204.html

到了这里,关于es--Elastic Search深度分页问题分析及四种解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用docker安装elastic search[ES]和kibana

    使用docker安装elastic search和kibana,版本均为7.17.1 docker pull# 去dockerhub看具体版本,这里用7.17.1 临时安装生成文件# 参数说明 -d 后台启动 –name 起别名即:NAMES -p 9200:9200 将端口映射出来 elasticsearch的9200端口是供外部访问使用;9300端口是供内部访问使用集群间通讯 -e “discovery.

    2024年02月14日
    浏览(45)
  • elasticsearch 深度分页查询 Search_after(图文教程)

    前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 search_after 是 Elasticsearch 提供的一种分页查询方式,它可以用来在已经排序的结果集中进行分页查询。 search_after查询步骤如下(下面有具体的例子帮助理解):

    2024年04月11日
    浏览(47)
  • ElasticSearch系列 - SpringBoot整合ES:实现分页搜索 from+size、search after、scroll

    01. 数据准备 ElasticSearch 向 my_index 索引中索引了 12 条文档: 02. ElasticSearch 如何查询所有文档? ElasticSearch 查询所有文档 根据查询结果可以看出,集群中总共有12个文档,hits.total.value=12, 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档? 03. ElasticSearch 如何指定搜

    2023年04月08日
    浏览(43)
  • ElasticSearch第六讲 ES 三种分页查询from+size / Scroll /search_after

    我的Git地址:https://gitee.com/ITLULU 欢迎访问 ES的分页查询和关系数据库的分页查询的区别: ES分页查询有以下几种: 1:简单的 from size (有默认的最大Size,不可无限大小查询,因为数据过多查询性能会降低,且也要考虑内存问题,以及OS缓存数据的能力) 2: scroll基于查询窗口

    2024年02月01日
    浏览(49)
  • Java客户端调用elasticsearch进行深度分页查询 (search_after)

    前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 具体的Search_after解释,可以看我这篇文章 elasticsearch 深度分页查询 Search_after(图文教程) 参考:https://blog.csdn.net/qq_44056652/article/details/126341810 作者:神的孩子

    2024年03月22日
    浏览(50)
  • 【elastic search】JAVA操作elastic search

    目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 本文是作者ES系列的第三篇文章,关于ES的核心概念移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 关于ES的下载安装教程以及基本使用,移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 在前文

    2024年01月25日
    浏览(46)
  • ES千亿级检索实战 堆OOM 问题深度分析

      在特大规模的索引中检索,通常一次检索涉及到的分片数达到2000个左右。加上跨集检索,堆有非常大的压力,OOM的问题经常发生。本篇文章,对线上环境的堆进行深度分析,看看都有什么。   我使用prifile来分析查看堆快照。并结合目前我对es底层的了解,来分析堆中都有

    2023年04月15日
    浏览(35)
  • 【51单片机入门】实现流水灯的原理及四种方法(详细易上手型)

    初学单片机,流水灯的实现是必不可少的,下面将介绍流水灯的原理及使用STC-ISP软件延时计算器生成的延时代码实现流水灯的四种方法,最后介绍如何将延时函数模块化。 目录  一、流水灯原理  二、循环 三、移位运算符 四、库函数 五、数组          六、延时函数模块

    2024年02月05日
    浏览(55)
  • ElasticSearch(ES)深度分页详解

    ElasticSearch 是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性。纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据库同样的深度分页问题,本文就此问题做一个实践性分析探讨 from + size 分页方

    2024年01月23日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包