Elasticsearch from+size 分页

from+size 实现分页

"浅"分页可以理解为简单意义上的分页。它的原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20的数据。这样其实白白浪费了前10条的查询。from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10,注意:size的大小不能超过index.max_result_window这个参数的设置,默认为10,000。如果搜索size大于10000,需要设置index.max_result_window参数

在之前的 空搜索 中说明了集群中有 14 个文档匹配了(empty)query 。 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档?和 SQL 使用 LIMIT 关键字返回单个 page 结果的方法相同,Elasticsearch 接受 from 和 size 参数:size显示应该返回的结果数量,默认是 10from显示应该跳过的初始结果数量,默认是 0如果每页展示 5 条结果,可以用下面方式请求得到 1 到 3 页的结果。

1.client发送分页查询请求到node1(coordinating node)上,node1建立一个大小为from+size的优先级队列来存放查询结果;

2.node1将请求广播到涉及到的shards上;

3.每个shards在内部执行查询,把from+size条记录存到内部的优先级队列(top N表)中;

4.每个shards把缓存的from+size条记录返回给node1;

5.node1获取到各个shards数据后,进行合并并排序,选择前面的 from + size 条数据存到优先级队列,以便 fetch 阶段使用。

各个分片返回给 coordinating node 的数据用于选出前 from + size 条数据,所以,只需要返回唯一标记 doc 的 _id 以及用于排序的 _score 即可,这样也可以保证返回的数据量足够小。

coordinating node 计算好自己的优先级队列后,query 阶段结束,进入 fetch 阶段。

from+size在深度分页时,会带来严重的性能问题:

CPU、内存、IO、网络带宽

数据量越大,越往后翻页,性能越低

你可能感兴趣的:(Elasticsearch from+size 分页)