网站首页 > 技术文章 正文
scroll 深分页
elasticsearch客户端实时分页一般使用from-size。如果有100条数据,按size=10共分10页,那么当用户查询第n页的时候,实际上elasticsearch是把前n页的数据全部找出来,再去除前n-1页最后得到需要的数据返回,查最后一页就相当于全扫描。且elasticsearch一般查询只支持最多查询出前1w条数据。所以离线大批量数据的处理业务或迁移不适合使用from-size方式查询。
为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式。
scroll 类似于sql中的cursor,使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容,所以scroll并不适用于有跳页的情景。
# 游标查询
POST /ad/_search?scroll=1m
{
"query":{
"match_all":{
}
},
"from":0,
"size":1
}
# 输出结果
{
"_scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw==",
"took":0,
"timed_out":false,
"_shards":{
"total":1,
"successful":1,
"skipped":0,
"failed":0
},
"hits":{
"total":{
"value":11,
"relation":"eq"
},
"max_score":1,
"hits":[
{
"_index":"ad",
"_type":"_doc",
"_id":"1",
"_score":1,
"_source":{
"name":"phone 8",
"price":6000,
"color":"white",
"ad":"this is a white phone",
"label":[
"white",
"nice"
]
}
}
]
}
}
scroll=1m表示设置scroll_id保留1分钟可用。使用scroll必须要将from设置为0。size决定后面每次调用_search搜索返回的数量。
然后我们可以通过数据返回的_scroll_id读取下一页内容,每次请求将会读取下1页数据,直到数据读取完毕或者scroll_id保留时间截止:
# 通过_scroll_id读取下一页内容
POST /_search/scroll
{
"scroll":"1m",
"scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw=="
}
# 输出结果
{
"_scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw==",
"took":1,
"timed_out":false,
"terminated_early":true,
"_shards":{
"total":1,
"successful":1,
"skipped":0,
"failed":0
},
"hits":{
"total":{
"value":11,
"relation":"eq"
},
"max_score":1,
"hits":[
{
"_index":"ad",
"_type":"_doc",
"_id":"2",
"_score":1,
"_source":{
"name":"xiaomi 8",
"price":4000,
"color":"red",
"ad":"this is a red phone",
"label":[
"white",
"xiaomi"
]
}
}
]
}
}
注意:请求的接口不再使用索引名了,而是 _search/scroll,其中GET和POST方法都可以使用。
scroll删除
根据官方文档的说法,scroll的搜索上下文会在scroll的保留时间截止后自动清除,但是我们知道scroll是非常消耗资源的,所以一个建议就是当不需要了scroll数据的时候,尽可能快的把scroll_id显式删除掉。清除指定的scroll_id:
DELETE
_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw==
清除所有的scroll:
DELETE _search/scroll/_all
猜你喜欢
- 2024-10-14 Excel表格太大时,怎么打印到一页上?
- 2024-10-14 写给Java应用开发者的Elasticsearch调优手册
- 2024-10-14 Excel表格太大时,怎么打印到一页上?收藏
- 2024-10-14 Excel中如何设置自动分页打印(excel表格怎么设置分页打印)
- 2024-10-14 还在浪费A4纸?按下Excel这个按钮,所有内容即可打印在同一页
- 2024-10-14 滑动页面时的控件设计规范——吸底&锚点
- 2024-10-14 ElasticSearch优化点简述(elasticsearch集群优化)
- 2024-10-14 一组Excel打印技巧,实用就好(excel打印技巧大全)
- 2024-10-14 打印设置用得好,天天追着幸福跑(打印基本设置)
- 2024-10-14 VBA实用代码赏析之八:页面、日期函数及选择的操作
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)