面试题答案
一键面试性能优化思路和方案
- 索引优化
- 字段映射优化:
- 避免使用
keyword
类型存储长文本,对于长文本使用text
类型,并指定合适的分词器。例如,如果是中文文本,使用ik_max_word
等适合中文的分词器,能提高分词效果和查询性能。 - 合理设置
doc_values
,对于需要排序、聚合的字段,确保doc_values
已开启。如果不需要对某些字段进行排序和聚合,可以关闭doc_values
以减少磁盘占用。
- 避免使用
- 索引分片和副本优化:
- 分析数据量和查询负载,合理调整分片数量。如果数据量持续增长,可适当增加分片数,但分片数不宜过多,过多分片会增加集群管理成本和查询开销。例如,初始可按照每片不超过30GB数据量来规划分片。
- 调整副本数量,副本主要用于数据冗余和高可用。在查询性能优先场景下,可适当减少副本数量,减少数据同步开销,但要保证一定的容错能力,如设置副本数为1。
- 字段映射优化:
- 查询优化
- 缓存查询结果:
- 在应用层引入缓存机制,如Redis。对于频繁查询且结果相对稳定的请求,先从缓存中获取数据。如果缓存中没有,则查询ElasticSearch,将查询结果存入缓存,并设置合理的过期时间。
- 优化查询语句:
- 避免使用通配符查询,特别是在开头使用通配符(如
*keyword
),这种查询会扫描大量文档,性能极低。尽量使用前缀查询(keyword*
)代替。 - 对于多条件联合查询,合理使用布尔查询(
bool
query)中的must
、should
、filter
等子句。例如,将过滤条件放入filter
子句,filter
子句不会计算相关性分数,能提高查询效率。 - 对于范围查询,尽量减少范围跨度,例如在时间范围查询时,尽量缩小时间窗口。
- 避免使用通配符查询,特别是在开头使用通配符(如
- 缓存查询结果:
- 硬件和集群优化
- 增加硬件资源:
- 如果服务器资源紧张,增加内存、CPU和磁盘I/O性能。ElasticSearch是内存密集型应用,足够的内存能提高缓存命中率,加快查询速度。高性能磁盘(如SSD)能提高数据读写速度。
- 集群负载均衡:
- 监控集群节点负载情况,通过ElasticSearch的自动负载均衡机制或手动调整分片分布,确保每个节点负载均衡。避免部分节点负载过高,影响整体查询性能。
- 增加硬件资源:
解决文档丢失问题的思路和方案
- 版本控制检查
- 确认是否因为并发写入导致版本冲突,进而部分文档丢失。在写入文档时,使用乐观锁机制,通过
version
字段进行版本控制。每次写入时,指定期望的版本号,如果实际版本号与期望不符,则写入失败,应用层可进行重试。
- 确认是否因为并发写入导致版本冲突,进而部分文档丢失。在写入文档时,使用乐观锁机制,通过
- 查询条件和过滤器检查
- 仔细检查查询条件和过滤器是否正确。有可能是过滤条件过于严格,导致部分文档被错误过滤。例如,检查日期范围、数值范围等过滤条件是否合理,是否存在边界值问题。
- 对于复杂查询,逐步拆解查询条件,分别测试每个条件,确保没有遗漏或错误的过滤逻辑。
- 数据同步和复制检查
- 如果是分布式环境,检查数据同步和复制过程是否正常。确认副本分片是否正确复制数据,是否存在网络故障导致部分数据同步失败。可通过ElasticSearch的集群健康检查API查看副本状态,对于同步失败的副本,重新进行同步操作。
- 索引重建和数据修复
- 如果怀疑索引数据损坏导致文档丢失,可尝试重建索引。先将原索引数据备份,然后重新创建索引并重新导入数据。在导入过程中,对数据进行完整性检查,确保数据准确无误。
- 对于部分丢失的文档,可通过数据备份或其他数据源进行手动修复,重新插入到ElasticSearch中。