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/

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