elasticsearch的深分页(deep-paging)问题原因及解决

1 deep-paging问题引入

有90个数字分布到三个分片上,每个分片上有30个数字。

shard1上:
1 、2、 3 、4 、5 、6 、7 、8、 9 、10 、11 、12 、13 、14、 15、 16、 17 、18、19 、20、 21、22、23、 24 、25 、26 、27、 28、 29 、30、

shard2上:
31 、32 、33 、34 、35 、36 、37 、38、 39 、40、 41 、42 、43、 44 、45 、46、 47 、48、 49、 50 、51 、52、 53、 54 、55 、56 57、 58、 59、 60 、

shard3上:
61、 62 、63 、64 、65 、66、 67 、68 、69 、70、 71 、72 、73、74 75、 76 、77 、78、 79 、80、81 、82、83、 84 、85、 86 、87、 88 、89、 90

假如查询第二页,然后每页15条。

是否可以每个分片上查询第二页,然后合在一起(3个shard一起45条)再排序,然后筛选15条?

答案是否定的。因为这不是topK问题,如果是topK则可以每个shard上取最大的15条,合在一起再取15条。

为什么答案是否定的,举个例子:

所以要想分页,只能每个分片上都取两页,再合起来排序,然后返回。这时问题就出现了,假如每页10条数据,我们想取第1000页。有3个分片,就需要每个分片取10010条数据合在一起,就会有30030条数据,然后排序。这无疑对带宽,内存,cpu都会造成压力,产生性能问题,会2-3秒后才返回。

2 解决

1 查询条数控制,不允许查询超过100页数据,如谷歌百度等最大允许查询100页

2 scoll滚动技术,会按批量返回,类似于游标

转载链接:https://blog.csdn.net/wabiaozia/article/details/105757540

附:

Solr 4.7 – efficient deep paging

https://solr.pl/en/2014/03/10/solr-4-7-efficient-deep-paging/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章