Elasticsearch 分页查询中的deep paging问题

分页查询的deep paging问题

首先回顾下分页查询

GET /lib3/user/_search
{
	"from": 0,
	"size": 2,
	"query": {
		"terms": {
			"interests": ["hejiu", "changge"]
		}
	}
}

GET /_search?from=0&size=3

deep paging:查询的很深,比如一个索引有三个 primary shard,分别存储了6000条数据,我们要得到第100页的数据(每页10条),类似这种情况就叫deep paging。

如何得到第100页的10条数据?

在每个 shard 中搜索990到999这10条数据,然后用这30条数据排序,排序之后取10条数据就是要搜索的数据,这种做法是错的;因为3个 shard 中的数据的 _score 分数不一样,可能这某一个 shard 中第一条数据的 _score 分数比另一个 shard 中第1000条都高,所以在每个 shard 中搜索990到999这10条数据然后排序的做法是不正确的。

正确的做法是每个 shard 把0到999条数据全部搜索出来(按排序顺序),然后全部返回给 coordinate node,由 coordinate node 按 _score 分数排序后,取出第100页的10条数据,然后返回给客户端。

Elasticsearch 分页查询中的deep paging问题_第1张图片

deep paging 性能问题
  1. 消耗网络带宽,因为所搜过深的话,各 shard 要把数据传递给 coordinate node,这个过程是有大量数据传递的,消耗网络。
  2. 消耗内存,各 shard 要把数据传送给 coordinate node,这个传递回来的数据,是被 coordinate node 保存在内存中的,这样会大量消耗内存。
  3. 消耗cup,coordinate node 要把传回来的数据进行排序,这个排序过程很消耗cpu。

鉴于deep paging的性能问题,所有应尽量减少使用。

解决深度分页问题

方法:Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search_after 实现深度分页

你可能感兴趣的:(elasticsearch)