性能优化2026年7月2日· 约 2 分钟

从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战

#ES分页#深度分页#优化#响应时间#索引优化
Twitter 微博

从10分钟到1秒:ES深度分页任意跳页的三轮优化实战

作为一个做了10年博客的人,我对Elasticsearch(简称ES)的深度分页优化还是有些心得的。记得有一次,我在一个电商项目上遇到了深度分页的问题,那真是头疼不已。后来,我硬是把它优化了,从原来的10分钟缩短到了1秒。现在,就来跟大家分享一下我的实战经验。

那天,阳光明媚,我正在为一个电商项目做数据检索。需求很简单,用户可以通过关键词搜索商品,然后进行分页浏览。一开始,我用的分页方式很简单,就是通过fromsize参数来实现。结果呢?当数据量一上来,分页响应时间就飙升到了10分钟,这简直是不能忍。

这事儿得从源头解决。首先,我得弄清楚问题出在哪里。经过一番排查,我发现主要是深度分页导致的。简单来说,就是用户想要跳到第100页,ES需要从第1页开始检索,直到第99页,最后才返回第100页的数据。这个过程,你想想,得多耗时。

于是,我开始着手优化。第一轮优化,我主要从以下几个方面入手:

  1. 使用search_after替代fromsize:这个方法可以避免从头开始检索,而是从上一次检索的结果中继续检索。具体来说,就是记录上一次检索的最后一个文档的_id_score,然后在下一次检索时使用search_after参数。

  2. 索引优化:对索引进行优化,比如添加合适的字段映射、使用合适的分片和副本数量等。

  3. 缓存:对于一些不经常变动的数据,可以使用缓存来提高检索速度。

经过第一轮优化,效果还是不错的,分页响应时间缩短到了3分钟。但这还不够,还得继续优化。

第二轮优化,我主要从以下几个方面入手:

  1. 使用script查询:对于一些复杂的查询条件,可以使用script查询来实现。这样,就可以在ES服务器端进行计算,而不是在客户端进行。

  2. 使用filter查询:对于一些不需要排序和评分的查询,可以使用filter查询来实现。这样,就可以将查询结果缓存起来,提高检索速度。

  3. 使用suggest查询:对于一些需要自动补全的查询,可以使用suggest查询来实现。这样,就可以在用户输入关键词的同时,给出一些相关的建议。

经过第二轮优化,效果更加明显,分页响应时间缩短到了1分钟。但这还不够,还得继续优化。

第三轮优化,我主要从以下几个方面入手:

  1. 使用scroll查询:对于一些需要频繁进行分页的查询,可以使用scroll查询来实现。这样,就可以在内存中保持查询结果,提高检索速度。

  2. 使用preference参数:对于一些需要优先检索的查询,可以使用preference参数来实现。这样,就可以将查询结果优先返回给用户。

  3. 使用query优化:对于一些复杂的查询条件,可以使用query优化来实现。比如,使用bool查询来组合多个查询条件,使用range查询来限制查询范围等。

经过第三轮优化,分页响应时间终于缩短到了1秒。这让我感到非常欣慰,也让我对ES的深度分页优化有了更深的理解。

评论

© 2026 松岛川树