简介:
由于es特殊的储存机制,单个索引的大量数据被均匀随机的存储在不同的分片上,列:每个分片可以存储一万条数据,分页需求:查询总数1000-1010的数据按时间排序,即第一百页的前十条。分布式存储无法保证这些数据都在同一个分片上。可能均匀地分布在不同分片当中。唯一的解决方法就是把每个分片的前1010条数据全部取出来,然后进行分页,数据总数=分片数*1010条数据,然后将数据总数按照时间排序,取出前1010条数据。
导致的问题:平凡的深度分页容易导致OOM,因为查询数据量过大导致ES查询和排序的时间也会加长。
解决方案:1.设置max_result_window参数。设置分页返回的最大数据,默认10000.这样设置只可以暂时解决问题,伴随着数据量增大OOM问题便会更加严重。
2.设置数据限制,参考淘宝,百度,谷歌等。越往后的数据对用户影响越小。
3.滚动查询:scoll search
滚动查询通过保存快照,查询时通过快照获取数据,这样的查询方式对于Client端不友好,因为数据的更新删除新增都不会影响快照。
4.search_after
这种方式是根据上一页的最后一条数据来确定下一页的位置,由于特殊的查询方式不支持跳页查询,只能以来上一页的数据
标签:快照,分页,1010,深度,查询,分片,数据,ES From: https://www.cnblogs.com/zzdd/p/17026693.html