【Es】es deep paging问题
1.概述
关联博客:【elasticsearch】elasticsearch 搜索结果的含义
转载:https://blog.csdn.net/gwd1154978352/article/details/82943037
2.分页搜索
在正常搜索之后添加
?from=0&size=2
注:当数据量达到50000条以上时,用下面的scroll滚动的方式进行代替
GET /_search?from=0&size=2
返回结果
{"took": 3,"timed_out": false,"_shards": {"total": 16,"successful": 16,"skipped": 0,"failed": 0},"hits": {"total": 8,"max_score": 1,"hits": [{"_index": ".kibana","_type": "doc","_id": "config:6.4.0","_score": 1,"_source": {"type": "config","updated_at": "2018-09-18T09:30:18.949Z","config": {"buildNum": 17929,"telemetry:optIn": true}}},{"_index": "blog","_type": "article","_id": "eTmX5mUBtZGWutGW0TNs","_score": 1,"_source": {"title": "New version of Elasticsearch released!","content": "Version 1.0 released today!","priority": 10,"tags": ["announce","elasticsearch","release"]}}]}
}
3. deep paging问题
deep paging简单来说,就是搜索的特别深,比如总共有60000条数据,现在有3个primary shard,每个shard上分20000条,每页是10条数据,这个时候你要搜索到第1000页,实际上要拿到的是10001-10010,该怎么拿呢?
请求首先可能是打到一个不包含这个index的shard的node上,这个node就是一个coordinate node,这个coordinate node就会将搜索请求转发到index的三个shard所在的node上去。
要搜索60000条数据中的第1000页,实际上每个shard都要将内部的20000条数据中的第1-10010条数据拿出来,不是10条,是10010条数据,3个shard每个shard都返回10010条数据给coordinate node,coordinate node会收到总共30030条数据,然后排序取到所需的那10条数据,其实就是我们要的最后的第1000页的10条数据。
举个例子,现在有60个带编号的球(从1到60),我现在随机给他们放到三个篮子里面(他们在篮子里面已经排好序了),现在我要取出第10-12个球,那我是不是应该先把各个篮子里面前12个球取出来放到一起(篮子里面的球是随机放的,无规律),共计36个球,然后汇总进行排序后,在这个结果中取出第10-12个球!!!
3.1 缺点
搜索过深的时候就需要在coordinate node上保存大量的数据,还要进行大量数据的排序,排序之后再取出对应的那一页,所以这个过程,既消耗网络宽带,耗费内存,还消耗cpu。这就是deep paging的性能问题,我们应该尽量避免出现这种deep paging操作。
3.2 解决方案
为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式,这个滚动的方式原理就是通过每次查询后,返回一个scroll_id。根据这个scroll_id 进行下一页的查询。可以把这个scroll_id理解为通常关系型数据库中的游标。但是,这种scroll方式的缺点是不能够进行反复查询,也就是说,只能进行下一页,不能进行上一页
。
经过分析,如果数据达到了50000条以上,那么用户基本上是不会考虑每条都去看的
,用户需要的是最后对数据分析处理后的结果。而如果小于50000条的时候我们可以使用from size的方式进行分页的查询。那么这种方式存在是为了什么情景呢。应该是为了分批次的检索所有数据。
3.3 实现步骤
1.首先取出前2条,并且得到scroll_id(这里的3s代表的是持续滚动时间,如果过了3秒钟,还没有查询下一页,那么这个scroll_id就会失效)。
GET /_search?scroll=3s&size=2
返回结果
{"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoEAAAAAAAAAPIFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAADyhZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAAA8sWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAPJFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAADzRZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAAA8wWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAPOFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAADzxZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAAA9cWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAPQFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAD0RZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAAA9UWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAPWFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAD0hZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAAA9MWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAPUFnhEVi1HVGViVFJxYzdlczBoRFI0clE=","took": 10,"timed_out": false,"_shards": {"total": 16,"successful": 16,"skipped": 0,"failed": 0},"hits": {"total": 8,"max_score": 1,"hits": [{"_index": ".kibana","_type": "doc","_id": "config:6.4.0","_score": 1,"_source": {"type": "config","updated_at": "2018-09-18T09:30:18.949Z","config": {"buildNum": 17929,"telemetry:optIn": true}}},{"_index": "blog","_type": "article","_id": "eTmX5mUBtZGWutGW0TNs","_score": 1,"_source": {"title": "New version of Elasticsearch released!","content": "Version 1.0 released today!","priority": 10,"tags": ["announce","elasticsearch","release"]}}]}
}
2.再次查询下一页,注意,这里查询时不需要指定index,只需要指定scroll_id和本次的持续滚动时间。
说白了,想要第几页,循环请求几次就行了,在设置的时间内scroll_id是不会变的
GET /_search/scroll?scroll=3s&scroll_id=DnF1ZXJ5VGhlbkZldGNoEAAAAAAAAAWtFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFuxZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABa4WeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAWwFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFrxZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABbIWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAWxFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFvBZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABbMWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAW0FnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFtRZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABbYWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAW3FnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFuBZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABbkWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAW6FnhEVi1HVGViVFJxYzdlczBoRFI0clE=
或者
POST /_search/scroll
{"scroll" : "3s","scroll_id":"DnF1ZXJ5VGhlbkZldGNoEAAAAAAAAAXIFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAF1RZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABccWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXWFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFyRZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABcoWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXLFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFzBZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABc0WeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXOFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFzxZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABdAWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXSFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAF0RZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABdQWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXTFnhEVi1HVGViVFJxYzdlczBoRFI0clE="
}
删除对应scroll_id
当我们搜索完毕或者说已经滚动到最后的时候,我们可以选择删除scroll_id
DELETE /_search/scroll/DnF1ZXJ5VGhlbkZldGNoEAAAAAAAAAXIFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAF1RZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABccWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXWFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFyRZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABcoWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXLFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFzBZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABc0WeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXOFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAFzxZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABdAWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXSFnhEVi1HVGViVFJxYzdlczBoRFI0clEAAAAAAAAF0RZ4RFYtR1RlYlRScWM3ZXMwaERSNHJRAAAAAAAABdQWeERWLUdUZWJUUnFjN2VzMGhEUjRyUQAAAAAAAAXTFnhEVi1HVGViVFJxYzdlczBoRFI0clE=
删除所有scroll_id
DELETE /_search/scroll/_all
【Es】es deep paging问题相关推荐
- 【Elasticsearch】 es ES节点memory lock重要性与实现方式
1.概述 转载:https://elasticsearch.cn/article/149 看一下Elastic官网对开启 bootstrap.memory_lock的介绍: Swapping is v ...
- ElasticSearch第一讲:ElasticSearch从入门到精通
ElasticSearch第一讲:ElasticSearch从入门到精通 业内目前来说事实上的一个标准,就是分布式搜索引擎一般大家都用elasticsearch.本文是ElasticSearch第一讲 ...
- 增大max_result_window是错的,ES只能查询前10000条数据的正确解决方案
文章目录 1.问题现象描述 2.错误的解决方案 2.1 使用`max_result_window`的错误解决方案 2.2 官方对`max_result_window`参数的解释 2.3 官方推荐的解决 ...
- ES:_search结果深入解析
1.搜索的timeout机制,底层的原理 GET /_search {"took": 4,"timed_out": false,"_shards&qu ...
- linux 查看es安装目录,Linux安装Elasticsearch
本文介绍Linux环境如何安装Elasticsearch. 本文环境是在腾讯云服务器CentOS7.2搭建的,JDK1.8,elasticsearch-5.4.2. 1 安装JDK 网上教程很多,也可 ...
- ES:记录curator+nfs进行索引备份、创建快照的一次实践
1. 安装curator工具 下面是我离线安装的过程 https://blog.csdn.net/weixin_43736084/article/details/121775484?spm=1001. ...
- linux-在cenos上安装大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es...)
云服务器 阿里云 腾讯云 七牛云 百度云 天翼云 华为云 西部数码 自己购买一个,学生和企业用户都有优惠的. putty 自己下载一个putty,用来操作云服务器. putty.org 一路下一步就o ...
- linux es数据库 head,elasticsearch安装es-sql插件
说明:本示例是在CentOs Linux7.4上运行,安装的es版本为6.8.0,对应es-sql版本6.8.0,es-head版本5.0.0,需要安装JDK 下载es安装包 wget https:/ ...
- 狂神说es笔记_人教版七上英语Unit5电子课本音频+课堂笔记+课后同步习题
1人教 七上英语Unit5单词 七年级英语上册Unit 5单词默写 1做:干(助动词)__________ 2做,干(助动词第三人称单数形式)__________ 3有__________ 4网球__ ...
最新文章
- python 画折线图怎么控制x轴间隔_如何在折线图的分类轴(xaxis)上指定标签之间的间隔?...
- eclispe的三个重要配置文件
- 【Java报错】mapper传入array\collection\list类型的参数时报BindingException:Parameter `` not found(问题复现+3种解决方法)
- 服务osgi_OSGi –具有服务的简单Hello World
- 双击获取GridView控件行信息
- 点亮led灯的个数_点亮一个led灯程序
- 8uftp,8uftp绿色版软件有哪些功能
- python做事务所审计收费标准_会计师事务所审计收费标准?2019审计报告收费标准...
- css裁剪图片 clip-path
- 学籍管理系统:详细设计说明书- -
- 服务器系统如用pe和做镜像,微软WDS网络启动PE做系统的服务器配置和PE修改教程...
- 计网自顶向下第四章归纳(网络层)
- nyoj 1248 海岛争霸 (并查集)
- vue---uedito---135
- 长尾分布下的分类问题
- S7-1200 DB数据块
- android键盘移动光标,移动端手机键盘唤起等常见问题
- 神经网络通俗理解和理解,卷积神经网络通俗理解
- 企业为什么要上OA系统?
- 浅谈西门子840d主轴速度控制_20190324工控维修日记(西门子系统第九讲)
热门文章
- 引入深国际、鲲鹏资本战略投资 苏宁易购复牌涨停
- 2.88万的五菱神车能赚钱吗?
- 月球好忙 蓝色起源2024年要将首位女性送上月球表面
- 让学生员工上夜班加班,供应商“惹怒”苹果:暂停与其新业务合作
- “一键删除中国App”应用海外走红,下载量破500万!谷歌:我先把你删除了
- 签约沈腾,易车开启三年品牌计划,穿越车市寒冬
- 网友质疑特斯拉电动汽车电池不利于回收 马斯克回怼!
- 弱小无助!苹果或将出手救援屏幕供应商JDI
- 是兄弟就来砍我!“贪玩蓝月”母公司实控人被捕:曾是中国最年轻富豪
- 人从众!五一假期全国旅游收入破千亿 你贡献了多少?