Elasticsearch:Scroll深度分页及返回大量数据
目录
方法一 设置size
方法二 from and size分页
方法三 scroll and scan滚屏。
在使用ES时,有时候不可避免的要返回大量的数据或者说返回满足你的查询条件的全部数据,而满足你的条件的数据可能只是上百条也可能是上万条。当需要返回的数据量特别大时怎么办呢?
方法一 设置size
在使用aggregations情况下,聚合的结果和直接查询一样默认都会只返回十条。如果超过10条就需要通过size來设置,但是如何让他返回全部的数据呢?在网上有人说聚合时设置size为0来返回全部数据,经测试不可行(用的是5.6版本的),不使用聚合时的size可以设为0或-1,但是聚合内的size必须要大于0。
除此之外也可以改变size的最大值,size的默认值最大值为10000,但是可以通过如下语句来设置size的最大值:
curl -XPUT http://127.0.0.1:9200/index/_settings -d '{ "index" : { "max_result_window" : 1000000}}'
方法二 from and size分页
使用 from and size 进行分页。但是es官方并不建议用这种方法进行大数据的查询尤其是深度分页,具体原因我们要知道它是如何查询的。
size为返回的结果个数,默认为10;from表示从第几行开始,不包含在内。
假设我们在有5个主分片的索引中搜索,查询第一页数据,即前10条数据,那么es会从每个分片中生成排序好的结果,取出前10条,然后返回给请求节点,请求节点再将这50条记录再次排序选出前10条。
但是如果请求的是第1000页的数据,即第10001至第10010条数据。那么es会从5个分片中取出各个分片顶端的10010条数据,然后将这总共50050条数据返回给请求节点,请求节点再次对这50050条数据进行一次全局排序,取出第50041至50050条数据,抛弃50040条数据,这就造成了很大的浪费。
在分布式系统中排序的花费会随着分页的深度而成倍增长,如果数据特别大对CPU和内存的消耗会非常巨大甚至会导致OutOfMemory,所以这也是为什么网络搜索引擎不能返回多余1000个结果的原因
方法三 scroll and scan滚屏。
scroll的作用不是用于实时查询数据,因为他会对es做多次请求,不可能做到实时查询。它的作用主要是用来查询大量数据或全部数据。
初始查询:
curl -XGET 'localhost:9200/index/type/_search?scroll=1m' -d '
{
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
后续查询:
curl -XGET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
注意:
1,scroll设置的一分钟,会随着每次的滚屏而刷新。此处不是指整个查询限时为1分钟,而是到下一次滚屏还有1分钟的时间。
2,后续请求时url中不应该有index和type,这些都在初始请求中,只需要使用scroll_id和scroll两个参数即可,其中scroll_id可以放在url中也可以放在请求体中
第一次请求时es会生成一个初始查询时索引的快照,并将旧的数据保护在手边,所以第一次查询之后对文档的一些改动不会影响查询结果。后续的每次请求都会记住哪些结果已经返回了,下一次继续返回剩下的,直到hits里的数据为空。但是scroll按照默认的进行排序依旧会是有消耗的,所以我们继续引入scan查询。
深度分页代价最高的就是全局排序,使用scan只需要把search_type设置成scan就可以禁用全局排序,如下:
GET /old_index/_search?search_type=scan&scroll=1m
{
"query": { "match_all": {}},
"size": 1000
}
GET /_search/scroll?scroll=1m
c2Nhbjs1OzExODpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExOTpRNV9aY1VyUVM4U0 <2>
NMd2pjWlJ3YWlBOzExNjpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzExNzpRNV9aY1Vy
UVM4U0NMd2pjWlJ3YWlBOzEyMDpRNV9aY1VyUVM4U0NMd2pjWlJ3YWlBOzE7dG90YW
xfaGl0czoxOw==
扫描式滚屏和标准滚屏的区别有以下几点:
1,scan结果没有排序,返回结果是doc在es中的顺序。
2,scan初始查询的结果中hits中不会有数据
3,因为没有排序,所以也不会支持聚合的一些操作
4,scan中size被应用到每一个分片上,所以我们在每次滚屏是最多获得size * number_of_primary_shards(size*主分片数) 个document
另外还有search after也可以一些聚合后的操作
参考资料《Elasticsearch权威指南》
---------------------
作者:fanxing1964
来源:CSDN
原文:https://blog.csdn.net/fanxing1964/article/details/79366399
版权声明:本文为博主原创文章,转载请附上博文链接!
Elasticsearch:Scroll深度分页及返回大量数据相关推荐
- Elasticsearch的深度分页
Elasticsearch的深度分页 查看篇博客可以先查看下elasticsearch的DSL搜索方便理解:传送门接描述 一.深度分页分析 1.深度分页:(from:9999:size:10) 第99 ...
- elasticsearch-php使用scroll深度分页处理数据(附代码)
一.前言 在刚开始学习ES的时候,觉得自带的from+size就足够使用了,但是在后续的学习中,不断看到一种说法,就是from+size,在要获取10000+10的时候就很影响性能.既然我们使用ela ...
- 京东面试题:ElasticSearch深度分页解决方案
前言 Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页.遍历等. 在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 ...
- elasticsearch 大数据场景下使用scroll实现分页查询
es查询大批量数据的"可能方案" 当使用es来请求大批量数据时,通常有三种办法,其一:直接查询获取全量数据:其二:使用setFrom以及setSize解决:其三:使用es自带的sc ...
- 如何在elasticsearch里面使用深度分页功能
2019独角兽企业重金招聘Python工程师标准>>> 前面的文章提到过es默认的from+size的分页方式返回的结果数据集不能超过1万点,超过之后返回的数据越多性能就越低. 这是 ...
- elasticsearch java 分页查询_elasticsearch深度分页问题
正版包邮elasticsearch实战与原理 70.1元 包邮 (需用券) 去购买 > elasticsearch分页对于用过es的人应该都会使用 ,和数据库的分页类似,如下所示,通过from ...
- ElasticSearch之处理深度分页
ElasticSearch之处理深度分页 一.常规分页 二.scroll分页 三.search_after 在ES中实现分页的方法有三种,我们逐个分析一下他们的优缺点. 一.常规分页 在ES中,我们可 ...
- ElasticSearch利用Search After解决深度分页问题
ElasticSearch利用Search After解决深度分页问题 1.ElasticSearch常见分页 2.ElasticSearch深度分页问题 3.ElasticSearch深度分页问题的 ...
- ElasticSearch 分页查询及深度分页原理与实现
查询流程 查询阶段 在初始化查询阶段(query phase),查询被向索引中的每个分片副本(原本或副本)广播.每个分片在本地执行搜索并且建 立了匹配 document 的优先队列(priority ...
最新文章
- 关于python使用cv画矩形并填充颜色同时填充文字
- Centos启动和禁用网卡命令
- 一主多备几影响 oracle,Oracle 10g 一主多备的搭建技巧
- (bower、grunt、gulp、jspm、karmam、webpack) 前端工程自动化开发工具
- VS代码中明明有NO_BITMAP字串,提示找不到
- mysql compopr_MySql应用的基本操作语句
- 老罗Android开发视频教程 打包下载地址,收集起来,给大家下载
- ISSCC 2017论文导读 Session 14 Deep Learning Processors,DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN
- php自带常量_php中的常量是什么 - php完全自学手册 - php中文网手册
- Word文档自动生成目录方法,一看就会!还会自动更新
- 1m照片的宽和高是多少_1M照片是多大
- 阿里云服务器上的数据是如何确保安全的
- python中一切都是对象对吗_在 Python 中一切皆对象,它完全支持()
- Ubuntu 16.04 安装好之后需要做的15件事
- python---flask解决跨域
- java读取apk、ipa包名、版本名、版本号等信息
- 液体之火,酒,写的真好 ~~
- 浅谈 web 端测试点
- 如何做SEO(关键词)
- 如何提炼好的软文标题
热门文章
- 网络安全笔记第三天(window7密码破解,NTFS)
- 闲鱼客服工具/消息管理系统:可以让客服放下手机,在电脑上管理闲鱼店铺的咨询信息
- 招聘过程中,3分钟看懂一个人
- M - 魔戒(BFS+四维数组)
- Qt插件:QPluginLoader
- 老虎证券开放api返回信息太长太啰嗦,返回值与账户api请求对应
- android读取运动数据权限_Android 计步模块(读取三星S健康步数)
- 用计算机3d建模做紫砂壶好吗,3D建模制壶,走在制壶科技的前沿——潘洪强
- AI和区块链的融合会带来什么?
- 电子邮件服务器组成部分,电子邮件三大组成部分