• (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的性能问题,所以应尽量减少使用。

  • 相关阅读:
    C语言博客05--指针
    网络1911、1912 D&S第2次作业--批改总结
    JAVA课程设计——愤怒的小鸟(个人)
    JAVA课程设计——愤怒的小鸟(团队)
    网络1911、1912 C语言第1次作业批改总结
    Python--安装第三方库的方法
    Eclipse中文插件安装教程
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
  • 原文地址:https://www.cnblogs.com/javasl/p/12655937.html
Copyright © 2020-2023  润新知