基本原理:
(1)搜索请求发送到某一个coordinate node协调节点,会构建一个priority queue,长度以paging操做from和size为准,默认是10
(2)coordinate node将请求转发到全部的shard,每一个shard本地搜索,并构建一个本地的priority queue
(3)各个shard将本身的priority queue返回给coordinate node,并构建一个全局的priority queuenode
基本原理:
(1)coordinate node协调节点构建完priority queue以后,就发送mget请求去全部shard上获取对应的document
(2)各个shard将document返回给coordinate node
(3)coordinate node将合并后的document结果返回给客户端。segmentfault
elasticsearch学习笔记(二十三)——Elasticsearch 分页搜索以及深分页性能问题
https://segmentfault.com/a/11...
好比总共有60000条数据,三个primary shard,每一个shard上分了20000条数据,每页是10条数据,这个时候,你要搜索到第1000页,实际上要拿到的是10001~10010,也就是会构建一个10010大小的priority queue。elasticsearch
注意这里千万不要理解成每一个shard都是返回10条数据。这样理解是错误的!性能
下面作一下详细的分析:
请求首先多是打到一个不包含这个index的shard的node上去,这个node就是一个协调节点coordinate node,那么这个coordinate node就会将搜索请求转发到index的三个shard所在的node上去。好比说咱们以前说的状况下,要搜索60000条数据中的第1000页,实际上每一个shard都要将内部的20000条数据中的第10001~10010条数据,拿出来,不是才10条,是10010条数据。3个shard的每一个shard都返回10010条数据给协调节点coordinate node,coordinate node会收到总共30030条数据,此时会构建一个30030大小的priority queue,而后在这些数据中进行排序,根据_score相关度分数,而后取到10001~10010这10条数据,就是咱们要的第1000页的10条数据。
以下图所示:学习