《空搜索》一節(jié)告訴我們?cè)诩褐杏?4個(gè)文檔匹配我們的(空)搜索語(yǔ)句。但是只有10個(gè)文檔在hits
數(shù)組中。我們?nèi)绾慰吹狡渌臋n?
和SQL使用LIMIT
關(guān)鍵字返回只有一頁(yè)的結(jié)果一樣,Elasticsearch接受from
和size
參數(shù):
size
: 結(jié)果數(shù),默認(rèn)10
from
: 跳過(guò)開(kāi)始的結(jié)果數(shù),默認(rèn)0
如果你想每頁(yè)顯示5個(gè)結(jié)果,頁(yè)碼從1到3,那請(qǐng)求如下:
GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10
應(yīng)該當(dāng)心分頁(yè)太深或者一次請(qǐng)求太多的結(jié)果。結(jié)果在返回前會(huì)被排序。但是記住一個(gè)搜索請(qǐng)求常常涉及多個(gè)分片。每個(gè)分片生成自己排好序的結(jié)果,它們接著需要集中起來(lái)排序以確保整體排序正確。
在集群系統(tǒng)中深度分頁(yè)
為了理解為什么深度分頁(yè)是有問(wèn)題的,讓我們假設(shè)在一個(gè)有5個(gè)主分片的索引中搜索。當(dāng)我們請(qǐng)求結(jié)果的第一頁(yè)(結(jié)果1到10)時(shí),每個(gè)分片產(chǎn)生自己最頂端10個(gè)結(jié)果然后返回它們給請(qǐng)求節(jié)點(diǎn)(requesting node),它再排序這所有的50個(gè)結(jié)果以選出頂端的10個(gè)結(jié)果。
現(xiàn)在假設(shè)我們請(qǐng)求第1000頁(yè)——結(jié)果10001到10010。工作方式都相同,不同的是每個(gè)分片都必須產(chǎn)生頂端的10010個(gè)結(jié)果。然后請(qǐng)求節(jié)點(diǎn)排序這50050個(gè)結(jié)果并丟棄50040個(gè)!
你可以看到在分布式系統(tǒng)中,排序結(jié)果的花費(fèi)隨著分頁(yè)的深入而成倍增長(zhǎng)。這也是為什么網(wǎng)絡(luò)搜索引擎中任何語(yǔ)句不能返回多于1000個(gè)結(jié)果的原因。
TIP
在《重建索引》章節(jié)我們將闡述如何能高效的檢索大量文檔