ES中搜索请求的讲解

ES中一个搜索请求是怎么流转的
1、搜索请求发送到某一个coordinate node,构建一个priority queue,长度以paging操作from和size为准,默认为10
2、coordinate node将请求转发到所有shard,每个shard本地搜索,并构建一个本地priority queue
3、各个shard将自己的priority queue返回给coordinate node ,并构建一个全局的priority queue
4、replica shard如何提升搜索吞吐量
一次请求要打到所有shard的一个replica/primary上去,如果每个shard都有多个replica,那么同时并发过来的搜索请求可以同时打到其他的replica上去
5、coordinate node构建完priority queue之后,获取到的是一堆doc id等信息,就发送mget请求去所有shard上获取对应的document
6、各个shard将document返回给coordinate node
7、coordinate node将合并后的document结果返回给client客户端
8、一般搜索,如果不加from和size,就默认搜索前10条,按照_score排序

例如:
coordinate node ,根据from和size参数,构建一个priority queue大小就是from+size,from=0,size=10,构建一个0+10大小的队列,from=10000,size=10,构建一个10000+10=10010大小的队列,将请求转发到这个index对应的所有shard上,接收到请求的shard,其实都会构建一个from+size大小的本地priority queue,每个shard都会构建一个10000+10=10010大小的priority queue.
每个shard将自己的10010条数据,返回给coordinate node ,coordinate node将所有shard的from+size大小的priority queue 进行merge,merge成一份from+size 大小的priority queue,全局排序后的queue,放到自己的queue中。此时coordinate queue,就可以将自己的priority queue中的数据,取出当前要获取的那一页的数据了,比如从第10000条,取到10010条

**deep paging问题:**就是from+size分页太深,那么每个shard都要返回大量数据给coordinate node,消耗大量的带宽,内存,CPU。

你可能感兴趣的:(Elasticsearch)