分页
最后更新于:2022-04-01 00:39:18
# 分页
在《空白搜索》一节中,搜索结果告诉我们在集群中共有14个文档匹配我们的(空白)查询。但是在`hits`数组中只有10个文档。我们怎样才能看到其他的呢?
与SQL使用`LIMIT`来控制单“页”数量类似,Elasticsearch使用的是`from`以及`size`两个参数:
| 参数 | 说明 |
|-----|-----|
| `size` | 每次返回多少个结果,默认值为`10` |
| `from` | 忽略最初的几条结果,默认值为`0` |
假设每页显示5条结果,那么1至3页的请求就是:
~~~
GET /_search?size=5GET /_search?size=5&from=5GET /_search?size=5&from=10
~~~
当心不要一次请求过多或者页码过大的结果。它们会在返回前排序。一个请求会经过多个分片。每个分片都会生成自己的排序结果。然后再进行集中整理,以确保最终结果的正确性。
> ### 分布式系统中的大页码页面
为了说明白为什么页码过大的请求会产生问题,我们就先预想一下我们在搜索一个拥有5个主分片的索引。当我们请求第一页搜索的时候,每个分片产生自己前十名,然后将它们返回给_请求节点_,然后这个节点会将50条结果重新排序以产生最终的前十名。
现在想想一下我们想获得第1,000页,也就是第10,001到第10,010条结果,与之前同理,每一个分片都会先产生自己的前10,010名,然后请求节点统一处理这50,050条结果,然后再丢弃掉其中的50,040条!
现在你应该明白了,在分布式系统中,大页码请求所消耗的系统资源是呈指数式增长的。这也是为什么网络搜索引擎不会提供超过1,000条搜索结果的原因。
> ### TIP
在《重索引》一章中,我们将详细探讨如何才能高效地获取大量数据。