目录
1、分页查询
查询阶段
返回阶段
深度分页
2、扫描(scan)和滚屏(scroll)
scroll滚屏
scan 扫描
1、分页查询
查询阶段
在初始化查询阶段,查询被向索引中的每个分片副本(原本或副本)广播。每个分片在本地执行搜索并且建立了匹配 文档的 优先队列。
优先队列:一个存有前 n 个 匹配 文档 的有序列表。这个优先队列的大小由分页参数 from 和 size决定。
GET /_search
{
"from": 90,
"size": 10
}
如图:
1. 客户端发送一个 分页查询请求 给 Node3,Node3 创建了一个长度为 from + size 的空优先级队列。
2.Node3 转发这个请求到索引中每个分片的原本或副本(只转发一个分片原本或副本中的一个),每个分片在本地执行这个查询并将结果放到一个大小为 from +size 的本地优先队列中。
3.每个分片返回 文档 的 ID 和它优先队列里的所有 文档的排序值给协调节点 Node3。Node3 把这些值合并到自己的优先队列里产生全局排序结果。
返回阶段
查询阶段时结果已经汇聚到了 协调节点Node3。例如根据指定查询 from:90, size: 10,那么前90条将会被丢弃,只有之后的10条需要返回给客户端。
深度分页
如上所示,如果from的值比较大,则意味着优先队列会比较庞大,每个分片的优先队列再汇聚到协调节点那就更庞大了,所以以上分页方式只适合浅层次的分页,深度分页需要用到 scan或scroll技术。
2、扫描(scan)和滚屏(scroll)
scan、scroll 可以高效地取回巨大数量的结果而不需要付出深分页的代价。
scroll滚屏
scroll类似于数据库中的游标 cursor。
滚屏搜索会即时制作快照。这个快照就是当前的一个数据副本,不会在搜索后被修改,直到快照到达过期时间自动销毁。
scan 扫描
深度分页代价最高的部分是对结果的全局排序,如果禁用排序,就可以以很低的代价获取全部返回结果。scan 就是采用这种搜索模式,不排序,只要分片里还有结果可以返回,就返回一批结果。