分页

在《空白搜索》一节中,搜索结果告诉我们在集群中共有14个文档匹配我们的(空白)查询。但是在hits数组中只有10个文档。我们怎样才能看到其他的呢?

与SQL使用LIMIT来控制单“页”数量类似,Elasticsearch使用的是from以及size两个参数:

参数 说明
size 每次返回多少个结果,默认值为10
from 忽略最初的几条结果,默认值为0

假设每页显示5条结果,那么1至3页的请求就是:

  1. GET /_search?size=5
  2. GET /_search?size=5&from=5
  3. GET /_search?size=5&from=10

当心不要一次请求过多或者页码过大的结果。它们会在返回前排序。一个请求会经过多个分片。每个分片都会生成自己的排序结果。然后再进行集中整理,以确保最终结果的正确性。


分布式系统中的大页码页面

为了说明白为什么页码过大的请求会产生问题,我们就先预想一下我们在搜索一个拥有5个主分片的索引。当我们请求第一页搜索的时候,每个分片产生自己前十名,然后将它们返回给请求节点,然后这个节点会将50条结果重新排序以产生最终的前十名。

现在想想一下我们想获得第1,000页,也就是第10,001到第10,010条结果,与之前同理,每一个分片都会先产生自己的前10,010名,然后请求节点统一处理这50,050条结果,然后再丢弃掉其中的50,040条!

现在你应该明白了,在分布式系统中,大页码请求所消耗的系统资源是呈指数式增长的。这也是为什么网络搜索引擎不会提供超过1,000条搜索结果的原因。


TIP

在《重索引》一章中,我们将详细探讨如何才能高效地获取大量数据。