zoukankan      html  css  js  c++  java
  • (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的性能问题,所以应尽量减少使用。

  • 相关阅读:
    hdu 1524
    hdu 1536
    转载一篇博弈博弈入门的好文章
    nim 博弈
    WPF 从Main函数启动
    C# map network drive sample
    Predicate 学习
    WPF 绑定到附加属性 绑定到只读属性
    WPF 带有watermark的文本输入框
    使用Windows服务发布WCF服务
  • 原文地址:https://www.cnblogs.com/javasl/p/12655937.html
Copyright © 2011-2022 走看看