和 SQL 使用 LIMIT 關(guān)鍵字返回單個(gè) page 結(jié)果的方法相同,Elasticsearch 接受 from 和 size 參數(shù):
size
顯示應(yīng)該返回的結(jié)果數(shù)量,默認(rèn)是 10 之前是20
from
顯示應(yīng)該跳過的初始結(jié)果數(shù)量,默認(rèn)是 0
語法
GET /_search?size=5
GET /_search?size=5&from=2
考慮到分頁過深以及一次請求太多結(jié)果的情況,結(jié)果集在返回之前先進(jìn)行排序。 但請記住一個(gè)請求經(jīng)??缭蕉鄠€(gè)分片,每個(gè)分片都產(chǎn)生自己的排序結(jié)果,這些結(jié)果需要進(jìn)行集中排序以保證整體順序是正確的。
在分布式系統(tǒng)中深度分頁
理解為什么深度分頁是有問題的,我們可以假設(shè)在一個(gè)有 5 個(gè)主分片的索引中搜索。 當(dāng)我們請求結(jié)果的第一頁(結(jié)果從 1 到 10 ),每一個(gè)分片產(chǎn)生前 10 的結(jié)果,并且返回給 協(xié)調(diào)節(jié)點(diǎn) ,協(xié)調(diào)節(jié)點(diǎn)對(duì) 50 個(gè)結(jié)果排序得到全部結(jié)果的前 10 個(gè)。
現(xiàn)在假設(shè)我們請求第 1000 頁—結(jié)果從 10001 到 10010 。所有都以相同的方式工作除了每個(gè)分片不得不產(chǎn)生前10010個(gè)結(jié)果以外。 然后協(xié)調(diào)節(jié)點(diǎn)對(duì)全部 50050 個(gè)結(jié)果排序最后丟棄掉這些結(jié)果中的 50040 個(gè)結(jié)果。
可以看到,在分布式系統(tǒng)中,對(duì)結(jié)果排序的成本隨分頁的深度成指數(shù)上升。這就是 web 搜索引擎對(duì)任何查詢都不要返回超過 1000 個(gè)結(jié)果的原因。