Elasticsearch分页搜索方式以及deep paging性能问题分析

原数据如下:

[
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "test" : "test"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "test" : "test2"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "test" : "test3"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 1.0,
        "_source" : {
          "test" : "test4"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "test" : "test5"
        }
      }
    ]

es的分页默认是10条,当然自己也可以添加分页参数:
Elasticsearch分页搜索方式以及deep paging性能问题分析_第1张图片


deep paging 逻辑分析

这时候假设整个index有3个primary shard,每个primary shard都有一个replica shard,分片总数为6片,index的总文档数为60000,数据平均分配后每个分片有10000条数据。

现在需要得到第10000~10010条的文档,也就是第10000页的文档,但这里并不是我们想象的每个shard(主,副节点有一个提供数据就好)都拿10条,取得一共30条给协调节点,然后排序取前10条返回给客户端,而是每个shard都要取的10010条,一共取得30030条文档给协调节点,排序好后再取10000~10010的那10条数据返回给客户端。

所以当分页搜索过深时,协调节点上就会存在大量数据,并且还要给这些数据进行排序,最后再取出需要的数据,这整个过程,数据消耗了内存,网络带宽,排序还对cpu也产生了消耗,所以深度分页会出现性能问题,要尽量避免。

你可能感兴趣的:(Elasticsearch)