elasticsearch-php使用scroll深度分页处理数据(附代码)_铁柱同学的博客-CSDN博客_php elasticsearch scroll


本站和网页 https://blog.csdn.net/LJFPHP/article/details/90052630 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

elasticsearch-php使用scroll深度分页处理数据(附代码)_铁柱同学的博客-CSDN博客_php elasticsearch scroll
elasticsearch-php使用scroll深度分页处理数据(附代码)
铁柱同学
于 2019-05-10 10:03:55 发布
2689
收藏
分类专栏:
Elasticsearch
文章标签:
elasticsearch
scroll
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LJFPHP/article/details/90052630
版权
Elasticsearch
专栏收录该内容
16 篇文章
2 订阅
订阅专栏
一、前言
      在刚开始学习ES的时候,觉得自带的from+size就足够使用了,但是在后续的学习中,不断看到一种说法,就是from+size,在要获取10000+10的时候就很影响性能。既然我们使用elasticsearch来处理大数据,那取10000条数据简直不要太随便,况且size默认不能超过10000,超过的话还要设置index.max_result_window参数,实在麻烦。所以博主这里使用scroll来实现数据的遍历查询。
相关链接: Elasticsearch:from&size返回值最大记录的修改设置 Elasticsearch——分页查询From&Size VS scroll
相关概念请看上面两篇博文,咱们这里不一一赘述了,直接开始php操作
二、操作实例
1、在es-php使用scroll的文档
官方scroll文档:https://www.elastic.co/guide/cn/elasticsearch/php/current/search_operations.html#scrolling%E6%B8%B8%E6%A0%87%E6%9F%A5%E8%AF%A2
2、代码
public function getIndexByTime($start,$end)
$start = strtotime($start) + 600; // 冗余10分钟的数据
$end = strtotime($end);
//组装搜索的索引
$params = [
'index' => $date_arr['index'], //多索引一起用,逗号隔开以数组的形式传过去,实测可以
'type' => '_doc', // type必须保持一致,且索引建立之后,无法更改索引
"scroll" => "30s", //这个代表每次翻页的时间间隔
"size" => 1000, //代表每次分页查询的条数
'body' => [
"_source" => [
"includes" => ["pixel.is50mClient","pixel.newbie", "pixel.channel", "pixel.os", "pixel.type", "pixel.user_id", "pixel.uuid", "*country_code2","clientip", "timestamp","@timestamp"], //查询的字段,最好是把自己需要的字段都列出来,不要查太多冗余字段
],
'query' => [
"bool" => [
"filter" => [
"range" => [
"@timestamp" => [
"gt" => $start_range,
"lt" => $end_range,
],
],
];
$repos = $this->client->search($params);
while (isset($repos['hits']['hits']) && count($repos['hits']['hits']) > 0) {
foreach($repos['hits']['hits'] as $key=>$v)
// 这里写上你的逻辑
$scroll_id = $repos['_scroll_id'];
$repos = $this->client->scroll([ //这里通过while循环,取得上次的scroll_id,继续查询,直到查不出来数据位置
"scroll_id" => $scroll_id,
"scroll" => "30s"
);
大概的代码如上,可以参照注释部分理解。
三、需要注意的地方
1、出现内存不够的情况,报错
Out of memory (allocated 364904448) (tried to allocate 262144 bytes)
      这个报错是php的报错,也就是查出的内存超过了php设置的内存。一般我们本地的内存设置成128M是够用的。所以出现这个情况优先考虑自己是不是操作查出的数组太频繁,foreach数组占用大量内存等。
2、搜索字段少一些
博主在出现内存告急之后试了下:
当搜索字段是全字段的时候,size超过200条就出现内存不足的情况
当搜索字段只列出需要的部分,size设置400条就出现内存不足的情况
当搜索字段只有一个的时候,size部分设置1000都可以
      综上所述,我们可以知道,在查询的时候,查出的字段要尽量的少,其次是size设置成合适的大小。(这部分只是举个例子,内存告急是代码部分的问题,修改之后就好了。) 优化数组内存部分:https://blog.csdn.net/LJFPHP/article/details/90053455
3、不够灵活
      当结果足够大的时候, scroll 性能更佳。但是不灵活和 scroll_id 难管理问题存在。使用 scroll 必须是按照顺序一页一页进行翻阅,如果是无规则的翻页,它的性能消耗也是极大的。这部分我们可以理解为类似于抖音视频的那种样子,我们看的时候只能往下拉而不能直接选择跳到多少页。因为跳页操作对于大数据来说是非常耗费性能的,对scroll来说也一样。所以大家要根据自己的实际需求去选择分页的方式。
      博主这里的数据对实时性要求不是很高,也不需要进行跳页操作,所以选用了scroll的方式,大家仁者见仁智者见智吧。加油!
end
关注博主即可阅读全文
铁柱同学
关注
关注
点赞
收藏
打赏
评论
elasticsearch-php使用scroll深度分页处理数据(附代码)
一、前言 在刚开始学习ES的时候,觉得自带的from+size就足够使用了,但是在后续的学习中,不断看到一种说法,就是from+size,在要获取10000+10的时候就很影响性能。既然我们使用elasticsearch来处理大数据,那取10000条数据简直不要太随便,况且size默认不能超过10000,超过的话还要设置ind...
复制链接
扫一扫
专栏目录
PHP7 Elasticsearch scroll常见错误
小y的专栏
07-24
1507
背景:使用PHP7查询Elasticsearch7的数据
错误1:Elasticsearch 7.0.1 - Trying to create too many scroll contexts. Must be less than or equal to: [500]
原因:在search($params)中设置的timeout时间内,累计生成的scroll_id数超过了最大限制
解决方法:...
使用scroll实现Elasticsearch数据遍历和深度分页
C18298182575的博客
01-06
308
作者:星爷
出处:使用scroll实现Elasticsearch数据遍历和深度分页
声明:转载请注明作者及出处。
背景
Elasticsearch 是一个实时的分布式搜索与分析引擎,被广泛用来做全文搜索、结构化搜索、分析。在使用过程中,有一些典型的使用场景,比如分页、遍历等。在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 Elasticsearch 中,也应该尽量避免使用深度分页。这篇文章主要介绍 Elasticsearch 中使用分页的方式、Elasticsearch .
参与评论
您还未登录,请先
登录
后发表或查看评论
php7.4+ElasticSearch7.12.rar
05-20
包含索引创建更新删除,映射设置,模糊、高亮自定义搜索偏移设置,多字段多国语言支持,数据库与索引文档同步等,丰富的封装,不懂的可以留言咨询
ElasticSearch之处理深度分页
weixin_44692700的博客
12-29
1471
ElasticSearch之处理深度分页一、常规分页二、scroll分页三、search_after
在ES中实现分页的方法有三种,我们逐个分析一下他们的优缺点。
一、常规分页
在ES中,我们可以给查询条件加from和size达到分页的效果,比如:
get test_index/_doc/_search
"query":{
"match_all":{}
},
"from":1000,
"size":3
但是这种使用方式效率是非常低的,比如上面那条语句,意味着ES要在每个分片
Elasticsearch from+size与scroll混合使用实现深度分页搜索
爱喝咖啡的程序员的博客
07-29
1009
目录一. 需求二. 思考三. 实现方案
一. 需求
环境准备: JDK1.8 Elasticsearch7.3.1 RestHighLevelClient客户端
对Elasticsearch做深度分页,比如第1500页,每页20条记录,且需要支持前后翻页。
二. 思考
由于index.max_result_window的限制,直接使用from+size无法搜索满足条件10000条以上的记录。如果贸然增大index.max_result_window值,那么你怎么知道系统未来会在索引内存多少条数据?就算这一次
elasticsearch php 分页,Elasticsearch普通分页from&size VS scroll滚动分页
weixin_39704246的博客
04-06
190
正 文:背景Elasticsearch 是一个实时的分布式搜索与分析引擎,被广泛用来做全文搜索、结构化搜索、分析。在使用过程中,有一些典型的使用场景,比如分页、遍历等。在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 Elasticsearch 中,也应该尽量避免使用深度分页。这篇文章主要介绍 Elasticsearch 中使用分页的方式、Elasticsearch 搜索...
php-elasticsearch scroll分页详解
weixin_38617363的博客
02-11
1428
背景
ps:首先我们在一个索引里面写入一万条以上的数据。作为数据源
现在我想看到第一万零一条数据,首先第一想法是,from 10000 size 1 ,这样做会包下面错误。显然是不成立的。此时便会用到scroll分页,
补充一点:from size分页,假如你要获取第1000到1010条数据,即from: 1000 size :10,它内部会先取出1-1010条数据,然后丢弃第1-100...
es游标获取全量数据游标php,ElasticSearch操作之游标查询Scroll Search
weixin_32488761的博客
03-24
328
一. 什么是游标查询(Scroll)顾名思义,相当于用一把游标标记查询的位置.二. 为什么要使用游标查询在默认情况下,ES查询每次返回的数量最多只有1W条,且只能是前1W条.这意味着,在不修改配置的情况下,想通过分页的方式(如下)拿到1W条之后的数据是做不到的GET /索引/类型/_search{"size": 10000,"from": 5000,"query": {...},"aggs": {...
es分页解决方案--深分页、浅分页
最新发布
一个偏离了诗和远方的女程序猿
01-10
2454
一、ES 的 from size(浅分页):
如果需要搜索分页,可以通过from size组合来进行。from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10。
1、原理:
客户端请求发给某个节点
节点转发给个个分片,查询每个分片上的前10条
结果返回给节点,整合数据,提取前10条
返回给请求客户端
2、分析
例如现有一个索引T,该索引接收到了一个查询请求,查询第3页,页大小100(也就是想要排序后第三页的100条数据),即设置了 from = 300, size =
ES--深分页Scroll
chbxw
03-31
953
一、前言
1.1、scroll与from+size区别
之前讲过from+size的分页,为何又有scroll+size的深分页呢?这里先对比一下两者的区别;
ES对于from+size的个数是有限制的,二者之和不能超过1w。当所请求的数据总量大于1w时,可用scroll来代替from+size。
from+size在ES查询数据的方式步骤如下:
1、先将用户指定的关键字进行分词;
2、将词汇去分词库中进行检索,得到多个文档的id;
3、去各个分片中拉取指定的数据,相对耗时较长;
4、将数据根据score
elasticsearch——深度分页scroll
qq_26915707的博客
10-22
434
项目一开始使用scan做全量查询:
documents = es.scan({"query": {"match_all": {}}}, size=500, raise_on_error=False,index="index")
for docs in documents:
yield [doc.get("_source") for doc in docs]
后来发现使用scroll查...
Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search_after 实现深度分页
zx711166的博客
09-05
5612
如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scroll滚动查询,一批一批的查,直到所有数据都查询完为止。
scroll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的
采用基于_doc(不使用_score)进行排序的方式,性能较高
每次发送scroll请求,我们还需要指定一个scroll...
php cursor scroll,jQuery插件scroll实现无缝滚动效果
weixin_39798626的博客
03-17
32
scroll滚动插件支持上下左右,淡入淡出,滚动时间设置,动画时间设置,鼠标经过是否停止设置默认配置参数可修改$(".content").easysroll({ //默认配置参数 direction: "left", //滚动方向 left(向左)right(向右) top(向上) bottom(向下) 默认left numberr: "1", //每一次滚动数量 默认是1 delays:"100...
MySQL必知必会(4至14章)
qq_38870388的博客
11-12
209
第四章:检索数据
第五章:排序检索数据
【MySQL】011-多表查询
訾博(ZiBo)的博客
08-19
1867
一、概述
1、查询语法
select
列名列表
from
表名列表
where
...
2、笛卡尔积:
有两个集合A、B,取这两个集合的所有组成情况;
要完成多表查询需要消除无用的数据;
3、多表查询的分类
①内连接查询;
②外连接查询;
③子查询;
二、内连接
1、隐式内连接
语法:
select
列名列表
fr...
【Elasticsearch】ES查询优化—Scroll API 滚动查询
Code Metaverse
02-22
1970
Scroll API 滚动查询前言查询第一次查询滚动请求清理scroll总结优点缺点参考资料
前言
ES的查询效率算是比较高的,但是from+size的分页查询方式只能查到一万条,并且随着分页到后面,执行效率越低。
Scroll滚动查询的方式可以查询大量数据,并能保证查询数据结果稳定。对于后台批量数据来说非常有用。
查询
第一次查询
第一次查询和通常的_search查询基本一致,只需要在后面加上?scroll=1m,1m代表一分钟,参考的时间格式如下
GET bbs/_search?scroll=1m
net nest es 字段截取前六位查询_ES亿级数据检索优化,三秒返回突破性能瓶颈
weixin_39862716的博客
11-30
370
点击上方的终端研发部,右上角选择“设为星标”每日早9点半,技术文章准时送上公众号后台回复“学习”,获取作者独家秘制精品资料往期文章VM 面试 4 连炮,你能顶住么?邮件这样写,PK 掉 99% 的同事Java 和.NET,谁将统治未来五年老android,我为什么要转后端?通过五轮阿里面试,阿里实习生亲述面试经历!Google 开源的依赖注入库,比 Spring 更小更快!java.la...
Elasticsearch的滚动查询---Scroll,解决ES每次最多查一万笔数据的问题
未知的希望,是我不灭的信仰
08-11
5571
接上篇,我们构造各种条件,可以进行各种查询,找到满足我们需求的数据,但是如果数据量大,不知道大家发现一个问题没,那就是你getHits,只能get到一万,一万之后的没办法,那是因为普通的搜索只能支持到这里......
不懂?那这么讲吧,咱们之前用的搜索,相当于MySQL的limit,这种分页,数据量少的话怎么玩都行,但是如果量大呢,比如我现在十个亿数据,你在ES给我分个页试试,你分页的前提是都查出来,排序,全都怼在内存了,大哥,你内存是多大啊,现在明白为啥之前那种搜索只能取出一万数据了吧
当然了,ES既
php底部滚动代码,div滑动到底部的scroll代码详解
weixin_33007509的博客
03-28
102
scroll也是一个很好用的标签,本文就为大家分享一篇判断p滑动到底部的scroll实例代码,具有很好的参考价值,希望能帮助到大家。实例如下所示:判断p滑到底部的代码#scrollTest{width:100px;height:100px;overflow-y: auto;//当p中y方向的内容溢出时,y轴分别显示滚动条border:1px solid red;}11122211122211122...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
铁柱同学
CSDN认证博客专家
CSDN认证企业博客
码龄6年
PHP领域优质创作者
396
原创
4857
周排名
319
总排名
273万+
访问
等级
2万+
积分
9261
粉丝
2247
获赞
1959
评论
3224
收藏
私信
关注
热门文章
windows下CMD常用命令
145565
vue中监听input框获取焦点,失去焦点的问题
98988
mysql的in查询是可以用到索引吗?亲测详解
58625
微信小程序之页面样式以及背景图片显示问题
56157
input框的value明明有值,但是不显示问题
52480
分类专栏
c++
5篇
golang
9篇
系统架构
1篇
从了解区块链到发布智能合约
11篇
react native基础讲解
25篇
mysql
61篇
python
9篇
linux
68篇
php日常bug
87篇
碎碎念
35篇
转载
13篇
微信公众号
4篇
React Native
28篇
JS
29篇
微信小程序
15篇
nginx
14篇
git
17篇
svn
1篇
物联网
5篇
laravel
20篇
shell脚本
3篇
linux之debian
4篇
linux之ubuntu
5篇
redis
4篇
数据结构
4篇
区块链
12篇
Vue.js
3篇
Yii
3篇
Elasticsearch
16篇
最新评论
2021中大厂php+go面试题(2)
铁柱同学:
去滴滴了
2021中大厂php+go面试题(2)
Lose Yourself.:
你现在在哪里啊
apache报错:Internal Server Error:The server encountered an internal error or misconfiguration and was
铁柱同学:
很久没写php了,我记得是在项目根目录,apache自动新建的貌似
虚拟机的ubunt系统在登录界面循环往复,登录不进去问题
铁柱同学:
我怀疑你文件路径错误了,或者你修改的是其他环境变量文件,你编辑的是另一个,恰巧另一个文件不存在,vim的时候相当于新建了个空白文件
apache报错:Internal Server Error:The server encountered an internal error or misconfiguration and was
欣坚强:
请问这个.htaccess文件在哪里找啊?我找不到啊
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
要学的东西太多了怎么办
c++传输二进制数据
主流编程语言的底层实现是什么以及gcc,clang,llvm等编译器的区别
2022年16篇
2021年6篇
2020年20篇
2019年105篇
2018年131篇
2017年221篇
目录
目录
分类专栏
c++
5篇
golang
9篇
系统架构
1篇
从了解区块链到发布智能合约
11篇
react native基础讲解
25篇
mysql
61篇
python
9篇
linux
68篇
php日常bug
87篇
碎碎念
35篇
转载
13篇
微信公众号
4篇
React Native
28篇
JS
29篇
微信小程序
15篇
nginx
14篇
git
17篇
svn
1篇
物联网
5篇
laravel
20篇
shell脚本
3篇
linux之debian
4篇
linux之ubuntu
5篇
redis
4篇
数据结构
4篇
区块链
12篇
Vue.js
3篇
Yii
3篇
Elasticsearch
16篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
铁柱同学
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值