从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
从10分钟到1秒:ES深度分页任意跳页的三轮优化实战
作为一个做了10年博客的人,我对Elasticsearch(简称ES)的深度分页优化还是有些心得的。记得有一次,我在一个电商项目上遇到了深度分页的问题,那真是头疼不已。后来,我硬是把它优化了,从原来的10分钟缩短到了1秒。现在,就来跟大家分享一下我的实战经验。
那天,阳光明媚,我正在为一个电商项目做数据检索。需求很简单,用户可以通过关键词搜索商品,然后进行分页浏览。一开始,我用的分页方式很简单,就是通过from和size参数来实现。结果呢?当数据量一上来,分页响应时间就飙升到了10分钟,这简直是不能忍。
这事儿得从源头解决。首先,我得弄清楚问题出在哪里。经过一番排查,我发现主要是深度分页导致的。简单来说,就是用户想要跳到第100页,ES需要从第1页开始检索,直到第99页,最后才返回第100页的数据。这个过程,你想想,得多耗时。
于是,我开始着手优化。第一轮优化,我主要从以下几个方面入手:
使用
search_after替代from和size:这个方法可以避免从头开始检索,而是从上一次检索的结果中继续检索。具体来说,就是记录上一次检索的最后一个文档的_id和_score,然后在下一次检索时使用search_after参数。索引优化:对索引进行优化,比如添加合适的字段映射、使用合适的分片和副本数量等。
缓存:对于一些不经常变动的数据,可以使用缓存来提高检索速度。
经过第一轮优化,效果还是不错的,分页响应时间缩短到了3分钟。但这还不够,还得继续优化。
第二轮优化,我主要从以下几个方面入手:
使用
script查询:对于一些复杂的查询条件,可以使用script查询来实现。这样,就可以在ES服务器端进行计算,而不是在客户端进行。使用
filter查询:对于一些不需要排序和评分的查询,可以使用filter查询来实现。这样,就可以将查询结果缓存起来,提高检索速度。使用
suggest查询:对于一些需要自动补全的查询,可以使用suggest查询来实现。这样,就可以在用户输入关键词的同时,给出一些相关的建议。
经过第二轮优化,效果更加明显,分页响应时间缩短到了1分钟。但这还不够,还得继续优化。
第三轮优化,我主要从以下几个方面入手:
使用
scroll查询:对于一些需要频繁进行分页的查询,可以使用scroll查询来实现。这样,就可以在内存中保持查询结果,提高检索速度。使用
preference参数:对于一些需要优先检索的查询,可以使用preference参数来实现。这样,就可以将查询结果优先返回给用户。使用
query优化:对于一些复杂的查询条件,可以使用query优化来实现。比如,使用bool查询来组合多个查询条件,使用range查询来限制查询范围等。
经过第三轮优化,分页响应时间终于缩短到了1秒。这让我感到非常欣慰,也让我对ES的深度分页优化有了更深的理解。
评论