目录

1、分页查询

查询阶段

返回阶段

深度分页

2、扫描(scan)和滚屏(scroll)

scroll滚屏

scan 扫描


1、分页查询

查询阶段

在初始化查询阶段,查询被向索引中的每个分片副本(原本或副本)广播。每个分片在本地执行搜索并且建立了匹配 文档的 优先队列。

优先队列:一个存有前 n 个 匹配 文档 的有序列表。这个优先队列的大小由分页参数 from 和 size决定。

GET /_search
{
    "from": 90,
    "size": 10
}

es 分库 es分库分表分页查询_优先队列

如图:

1. 客户端发送一个 分页查询请求 给 Node3,Node3 创建了一个长度为 from + size 的空优先级队列。

2.Node3 转发这个请求到索引中每个分片的原本或副本(只转发一个分片原本或副本中的一个),每个分片在本地执行这个查询并将结果放到一个大小为 from +size 的本地优先队列中。

3.每个分片返回 文档 的 ID 和它优先队列里的所有 文档的排序值给协调节点 Node3。Node3 把这些值合并到自己的优先队列里产生全局排序结果。

返回阶段

es 分库 es分库分表分页查询_分页_02

查询阶段时结果已经汇聚到了 协调节点Node3。例如根据指定查询 from:90, size: 10,那么前90条将会被丢弃,只有之后的10条需要返回给客户端。

深度分页

如上所示,如果from的值比较大,则意味着优先队列会比较庞大,每个分片的优先队列再汇聚到协调节点那就更庞大了,所以以上分页方式只适合浅层次的分页,深度分页需要用到 scan或scroll技术。

2、扫描(scan)和滚屏(scroll)

scan、scroll 可以高效地取回巨大数量的结果而不需要付出深分页的代价。

scroll滚屏

scroll类似于数据库中的游标 cursor。

滚屏搜索会即时制作快照。这个快照就是当前的一个数据副本,不会在搜索后被修改,直到快照到达过期时间自动销毁。

scan 扫描

深度分页代价最高的部分是对结果的全局排序,如果禁用排序,就可以以很低的代价获取全部返回结果。scan 就是采用这种搜索模式,不排序,只要分片里还有结果可以返回,就返回一批结果。