(50)ElasticSearch之分页查询中的deep paging问题

  请看下面两种分页查询的示例: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的性能问题,所以应尽量减少使用。

posted @ 2020-04-08 12:12  雷雨客  阅读(179)  评论(0编辑  收藏  举报