在 Elasticsearch(ES)中,进行大数据查询时,常常会由于多种因素而导致性能显著下降。接下来,我们将深入探讨几种常见情况及其相应的解决方案。
一、常见问题分析
- 深分页、大排序
- 大量数据扫描与多分片上的多次排序会严重影响性能。
- 深分页的性能问题源于 ES 需要扫描并排序大量数据,这一过程不仅要在每个分片上进行扫描排序,还需在主查询节点上进行召回汇总,涉及二次排序。
- 大排序是指在大量数据上进行排序,同样会带来性能挑战。
- 通配符查询与正则表达式查询
- 这两种查询方式容易导致全表扫描,消耗大量资源。
- 高基数字段聚合
- 高基数排序可能耗尽内存和计算资源,例如按照玩家 ID 分组进行聚合。
- 脚本查询
- 脚本在每个文档上执行,消耗 CPU 和内存,且无法利用缓存。
- 大字段全文搜索
- 大字段的倒索引和存储极为耗费资源。
二、解决方案分类介绍
- 深分页、大排序
- 深分页:
- 产品方面:
- 采用虚拟滚动实现分页,提升用户体验的同时优化性能。
- 限制总数 track_total_hits,控制在百万以内,例如将 totalCount 最多记录设置为 100 万,多余部分直接显示为 100w+。
- 技术方面
- 产品方面:
- 深分页: