在es的分页前,首先有一个基础点要明确。
    es的索引是有分片的,数据会按照哈希分布到各个分片中。
    image.png
    假设,索引分成了三个分片,现在想要按相关度查询前10个结果。
    那么,如何知道这十个结果如何在三个分片中分布?

    一个显而易见的做法是,将三个分片的数据合起来,按相关度排序,再返回给客户端。
    那么这样造成的问题是,分出的三个分片,因为分页查询而不得不重新聚合到一起,分片就失去了意义。

    在es中,分页的做法是,从每个分片中取前10条记录,回到协调节点中。协调节点用这三个分配返回的共30条数据做排序,最终返回前10条,抛弃剩下的20条。

    这是第一页的情况。如果是第100页,取10条记录呢?
    能不能直接取每个分片的1000~1010条记录做排序呢?
    显然是不行的,因为如果三个分片的数据相差不大,按数学期望来看,要取出的十条记录应该在每个分片的1000/3~1010/3之间。
    如果分片不均匀,甚至有可能出现P0取1000~1010,P1,P2一条都不会取到的情况。

    这时的做法只能是三个分片返回前1010条记录,协调节点对这3*1010条记录做排序,再取其中的1000~1010条记录。

    因此为了查询10条记录,取出了3030条记录,并抛弃了3020条记录。

    这就是问题所在,分页越深,所查询的数据就越多,期望结果和总搜索条数的比率就越低。