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

mac2022-07-05  33

原数据如下:

[ { "_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条,当然自己也可以添加分页参数:


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也产生了消耗,所以深度分页会出现性能问题,要尽量避免。

最新回复(0)