elasticsearch分页查询

新博客地址

主要有两种方式

from/size

from 偏移,默认为0

size 返回的结果数,默认为10

在数据量不大的情况下我们一般会使用from/size,而在深度分页的情况下效率极低,该命令会把from+size条记录全部加在到内存中,对结果返回前进行全局排序,然后丢弃掉范围外的结果,并且每次执行都会重复这样的操作,运行速度极慢而且往往还会造成es内存不足而挂掉。

从index A的type B中搜索出从0开始的1w条数据:

curl -XGET "hostname:9200/A/B/_search?from=0&size=10000"

理解深度分页为什么慢

让我们假设在一个有5个主分片的索引中搜索。当我们请求结果的第一页(结果1到10)时,每个分片产生自己最顶端10个结果然后返回它们给请求节点(requesting node),它再排序这所有的50个结果以选出顶端的10个结果。

现在假设我们请求第1000页——结果10001到10010。工作方式都相同,不同的是每个分片都必须产生顶端的10010个结果。然后请求节点排序这50050个结果并丢弃50040个!

在分布式系统中,排序结果的花费随着分页的深入而成倍增长。

ps: 我曾经在一个14亿条记录的type中使用from/size进行分页,多么痛的领悟。。。

scan/scroll

scan(扫描)搜索类型是和scroll(滚屏)API一起使用来从es里高效地取回巨大数量的结果而不需要付出深分页的代价。

scroll 做一个初始阶段搜索并且持续批量从es里拉取结果直到没有结果剩下,类似传统数据库里的cursors。

scan es查询将不再进行排序。

因为size作用在每个shard上,所以每次GET的数据量为shard_num*size条:

curl -XGET "hostname:9200/A/B/_search?search_type=scan&scroll=5m&size=200000"

将会返回一个过期时间为5分钟scroll_id

"_scroll_id" :
"c2Nhbjs1OzkwODg5OmEta2lMZlJJUmFxMDVvdWNLWXR0dUE7NDI5NTA1OnF
jcVZSQUdnU3hpdy15XzRYT0lYWVE7OTA4OTA6YS1raUxmUklSYXEwNW91Y0tZ
dHR1QTs5MDg5MTphLWtpTGZSSVJhcTA1b3VjS1l0dHVBOzkwODkyOmEta2l
MZlJJUmFxMDVvdWNLWXR0dUE7MTt0b3RhbF9oaXRzOjE0NDk0MDM4NTI7"

根据该scroll_id从es中检索数据,每次调用都会检索下一批数据,并将scroll_id的过期时间重置为5m,直到所有数据检索完毕或者scroll_id过期:

curl -XGET "hostname:9200/_search/scroll?scroll=5m" -d
 'c2Nhbjs1OzkwODg5OmEta2lMZlJJUmFxMDVvdWNLWXR0dUE7NDI5NTA1OnFjc
 VZSQUdnU3hpdy15XzRYT0lYWVE7OTA4OTA6YS1raUxmUklSYXEwNW91Y0tZdHR1QTs5
 MDg5MTphLWtpTGZSSVJhcTA1b3VjS1l0dHVBOzkwODkyOmEta2lMZlJJUmFxMDVvdWNLWXR
 0dUE7MTt0b3RhbF9oaXRzOjE0NDk0MDM4NTI7'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值