关注、星标下方公众号【 大数据之美 】,和你一起成长

原文链接:你还不会ElasticsSearch分页查询?那你看这一篇就够了,快拿走吧

引言

我们使用mysql的时候经常遇到分页查询的场景,在mysql中使用limit关键字来实现分页。比如下面的示例

select * from orders where category='man' limit 100,100;

ElasticsSearch 同样也有很多分页查询的场景,特别是在数据量比较大,而且查询条件比较复杂的情况下。在 mysql 中如果在某种无法命中索引的情况下,可以选择使用ES的分页查询进行功能替换。

ES实现分页查询有几种不同的方案,每种方案都有自己的优缺点,下面就带你领略一下 ES 分页查询的魅力吧。

1、from/size方案

ES 分页最常用的一种方案,类似 mysql 里的limit,from指定查询的起始位置,size表示从起始位置开始的文档数量,如下基础查询:

GET kibana_sample_data_flights/_search

其中:

  • from:未指定,默认值是 0,注意不是1,代表当前页返回数据的起始值。
  • size:未指定,默认值是 10,代表当前页返回数据的条数。
  • 默认返回前10个匹配的匹配项。

优缺点

  • 优点:支持随机翻页,
  • 缺点:受制于 max_result_window 设置,不能无限制翻页,越往后翻页越慢,存在深度翻页问题。

适用场景

  1. 非常适合小型数据集或者大数据集返回 Top N结果集的业务场景
  2. 支持随机跳转分页的业务场景

2、search_after 查询

有时候我们会遇到一些业务场景,需要进行很深度的分页,但是可以不指定页数翻页,只要可以实时请求下一页就行。比如一些无限下拉的瀑布流页面。
search_after 查询方案是使用前一页中的一组排序值来检索匹配的下一页。利用实时有游标来帮我们解决实时滚动的问题,简单来说前一次查询的结果会返回一个唯一的字符串,下次查询带上这个字符串,进行下一页的查询。
类似下面这个查询:

GET /_search
{"size" : 2,"sort": [{"order_datetime": "desc","_id": "asc"}]
}

查询结果的最后,有个sort的json结构:

"sort": [
1704147780000,
"um1362393"
]

这里记录了上一次查询的位置,所以当在查询下一页时,只要把这些值带上就可以实现。

GET /_search
{"size" : 2,"sort": [{"order_datetime": "desc","_id": "asc"}],"search_after": [
1704147780000,
"um1362393"
]
}

就这样一直操作就可以实现不断的查看下一页了。很显然,这个查询操作的开销会很小,但是缺点就是无法进行随机翻页,可以类比链表和数组。

3、Scroll 遍历查询

相比于 from/size 和 search_after 返回一页数据,Scroll API 可用于从单个搜索请求中检索大量结果。但是 scroll 滚动遍历查询是非实时的,数据量大的时候,响应时间可能会比较长。

示例如下:

POST /_search?scroll=3m
{"size": 100,"query": {"match": {"host": "elastic"}}
}

首先第一次查询后,会生成一个当前查询条件结果的快照,后面的每次叫翻页都是基于这个快照的结果,也就是即使有新的数据进来也不会被查询到。

上面这个查询结果会返回一个scroll_id,拷贝过来,组成下一条查询语句

POST /_search/scroll
{"scroll" : "1m","scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlNpZU5wVVhoUlhHd0NqNEhsNktKQmcAAAAACz8y-xZ3SFBodGo1MVJNdV9UN21jMmo5aGd3"
}

以此类推,后面每次滚屏都把前一个的scroll_id复制过来。注意到,后续请求时没有了index信息,size信息等,这些都在初始请求中,只需要使用scroll_id和scroll两个参数即可。

总结

  1. from/size方案的优点是简单,缺点是在深度分页的场景下系统开销比较大。
  2. search after 可以实时高效的进行分页查询,但是只能做下一页的查询场景,不能进行随机页数查询。
  3. scroll方案基于快照,不能用在高实时性的场景下,建议用在类似数据导出场景下使用。

你还不会ElasticsSearch分页查询?那你看这一篇就够了,快拿走吧相关推荐

  1. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  2. 听说你还搞不懂Golang的Slice?看这一篇就够了!

    在前面的文章中,我和大家一起学习了一下关于 Go 语言中数组的知识,当时有提到过一个知识点:在函数中传递数组是非常耗资源的一件事,所以更推荐大家使用切片(slice)来这么做. 那么切片又是一个怎样的 ...

  3. mysql 去重取出最小值_5000字总结MySQL单表查询,新手看这一篇足够了!

    4.过滤 工作用的数据库表中一般包含大量数据,很少会一次全部查询,所以会使用where子句加过滤条件来查询我们需要的数据. 认识操作符 比较操作符 =(等于),<>.!=(不等于),=(大 ...

  4. 你还在纠结用什么库写 Python 命令行程序?看这一篇就够了

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. 本文作 ...

  5. MySQL高级查询语句——超详细,一篇就够了

    MySQL高级查询语句 一.MySQL进阶查询 1.1.按关键字排序--order by 1.2.对结果进行分组--group by 1.2.1.单个分组 1.2.2.分组结合order by使用 1 ...

  6. python用什么敲代码_你还在纠结用什么库写 Python 命令行程序?看这一篇就够了...

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. 本文作 ...

  7. 冷热分离和直接使用大数据库_还不知道HBase冷热分离的技术原理?看这一篇就够了...

    作者:郭泽晖(索月),阿里巴巴技术专家 HBase是当下流行的一款海量数据存储的分布式数据库.往往海量数据存储会涉及到一个成本问题,如何降低成本.常见的方案就是通过冷热分离来治理数据.冷数据可以用更高 ...

  8. java中怎么判断一段代码时线程安全还是非线程安全_Java 中的多线程你只要看这一篇就够了...

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  9. 接口测试,后端接口还没开发完,如何测?解决看这一篇就够了......

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

最新文章

  1. mac 安装Pillow
  2. Bean装配之Aware接口
  3. jmeter5.1.1启动提示not able to find java executable or version的解决办法
  4. js 刷新页面window.location.reload();
  5. python 进制间相互转换
  6. android hook 模拟点击_手把手讲解 Android Hook-实现无清单启动Activity
  7. THREEJS - 点击/拾取
  8. unity3d从零開始(五):了解摄像机
  9. MySQL 5.7.9 免安装配置
  10. python使用queue和线程池
  11. Java单例模式简单代码
  12. HTML怎么让左边占满整个竖屏,关于移动端页面强制竖屏
  13. 布隆过滤器与布谷鸟过滤器
  14. Qt之QVector基本用法
  15. 24个基本指标精粹讲解(5)--SR
  16. 什么是钩子,钩子的原理
  17. 菜谱:木瓜花生鸡脚汤和苦瓜黄豆排骨煲
  18. group by与order by的区别
  19. 图数据库在中国移动金融风控的落地应用
  20. nginx安装(编译gz安装rpm安装)

热门文章

  1. Java反射机制(反射Field,Method,Constructor,资源绑定器)
  2. Windows下虚拟机VMwares安装
  3. nPlayer for Mac(视频播放神器)
  4. 利用LruCache为GridView异步加载大量网络图片完整示例
  5. 电子科大 数据结构专题
  6. 数据库的基本概念与组成
  7. html格式自动出现乱码,HTML页面乱码怎么解决?
  8. java吃货联盟系统源码_吃货联盟 源代码 Java初级小项目
  9. 文本分析——分配单词权重
  10. 腾讯云海量社交网络业务下的DevOps架构应用实践