请看下面两种分页查询的示例:from是从第几个文档开始查询,size是查几个文档
GET /lib/user/_search?from=0&size=3
GET /lib/user/_search { "from":0, "size":2, "query":{ "terms":{ "interests":["hejiu","changge"] } } }
1、什么是deep paging
查询的很深,比如一个索引有三个primary shard,存储了6000条数据,每个shard 2000条,要得到第100页的数据(每页10条),类似这种情况就叫deep paging
2、如何得到第100页的10条数据
1)错误的理解
查询到的是从每个shard的(100-1)*10的下标开始的,即查询的范围是990-999。在每个shard中搜索990到999这10条数据,然后用这30条数据排序,排序之后取10条数据就是要搜索的数据,这种做法是错的,因为3个shard中的数据的_score分数不一样,可能这某一个shard中第一条数据的_score分数比另一个shard中第1000条都要高,所以在每个shard中搜索990到999这10个数据然后排序的做法是不正确的。
2)正确的理解
每个shard把0-999(每个shard的前100页的数据,每个shard取前1000条)条数据全部搜索出来(按排序顺序),然后全部返回给coordinate node,由coordinate node按_score分数排序后,取出第100页的10条数据,然后返回给客户端。
3、deep paging 性能问题
1)耗费网络带宽,因为搜索过深的话,各shard要把数据传送给coordinate node,这个过程是有大量数据传递的,消耗网络。
2)消耗内存,各shard要把数据传送给coordinate node,这个传递回来的数据,是被coordinate node保存在内存中的,这样会大量消耗内存。
3)消耗cpu,coordinate node要把传回来的数据进行排序,这个排序过程很消费cpu。
鉴于deep paging的性能问题,所以应尽量减少使用。