Elasticsearch 通过 from
和 size
参数来实现分页. size
表示返回的结果数量, 默认为 10, from
则表示从起始结果算起要跳过的结果数量, 默认为 0. 所以, 默认情况下如果返回结果数是 10 个以上, 我们得到的只有前十个结果.
1.X 的时候不过请求的页数多深, 结果数多大都会給你返回结果, 只是越到后面的页数越大或者结果数越多, 执行的效率会逐渐变慢而已.
页数越大之所以返回效率越差, 是因为 Elasticsearch 分页的工作方式是从所有主分片的索引中返回排在最前面的 size
数量的结果, 然后再把各个分片结果合并以后再排序, 然后再返回前 size
个结果.
假设还是默认值, 如果想返回第 1000 页的话, 也就是排在 10001 - 10010 的结果. 而并不是直接一拿就拿到排在第 10001 之后的结果集, 而是返回 10010个结果然而排序, 然后丢弃掉前面的 10000 个结果.
这是只有一个主分片的情况是这么工作的, 而如果假设是 5 个主分片的话. 还是请求第 1000页, 那么 Elasticsearch 要在这 5 个主分片下搜索结果, 然后每个分片得到 10010 个结果, 合并以后排序这 50050 个结果, 最后丢弃前面的 50040 个.
所以, 不管是 Google 还是百度, 都会限定返回的结果页数. 用 Google 搜索 Elasticsearch
返回了 466,000 条结果, 然而只给我们前 15 页的.
然后, 升到 2.X 以后, 如果请求产生的结果数超过一万个的话, 会抛出这样的错误信息
|
|
Elasticsearch 也很 nice 的建议我们使用 Scroll API.
|
|
|
|
可以看到每一次 scroll 返回的结果都带有 _scroll_id
, 然后后续接着利用这个 _scroll_id
来滚动搜索.
|
|
|
|
scroll: '5m'
是指这个 _scroll_id 的有效时长为 5分钟, 除了分钟以外, 年月日时分秒都可以.
btw, 官方说每次 scroll 以后产生新的 _scroll_id, 不知道是不是理解错误, 除非开启一个新的 scroll 会生成新的 _scroll_id, 不然, 如果在有效时间内继续滚动的话返回的 _scroll_id 是一样的.
如果只对查询的结果总体感兴趣而不需要对总体排序的话, 可以使用更为高效的 scan
模式,
|
|
Related:
Elasticsearch More Like This 搜索
Elasticsearch Aggregations 聚合分析