面试题答案
一键面试查询语句优化
- 简化过滤器:检查并移除不必要的过滤器。如果多个过滤器功能相近,尝试合并。例如,避免重复过滤相同条件。
- 优化聚合:减少聚合的层级和复杂度。如果不需要多层嵌套聚合,简化为单层或更少层。同时,避免对大量数据进行复杂聚合操作,可考虑使用预聚合数据。
- 嵌套查询优化:对于嵌套查询,确保嵌套深度合理。过深的嵌套会增加查询复杂度和性能损耗。尽量将嵌套查询逻辑优化为更扁平的结构。可以通过重新设计文档结构,将部分嵌套关系展平,减少嵌套查询使用。
- 使用排序:若有排序需求,确保排序字段有适当的索引。避免对高基数(唯一值多)字段排序,尽量对低基数字段排序,以提升性能。
- 分页优化:避免使用过大的
from
和size
参数进行分页。使用scroll
API进行大数据集分页,或采用基于游标(cursor - based)的分页方式,如search_after
。
索引结构调整
- 字段映射优化:确保字段映射类型正确。避免使用不必要的复杂数据类型,例如,如果字段仅需存储数字,使用合适的数值类型而不是通用的文本类型。对文本字段合理设置分词器,对于不需要分词的字段,设置为
not_analyzed
以减少索引空间和查询计算量。 - 索引分片与副本:根据数据量和查询负载调整分片数量。过少的分片可能导致数据集中,查询压力大;过多的分片会增加管理开销。副本数量也应适当,副本过多会占用更多资源,影响写入性能,根据读多写少或写多读少的业务场景调整副本数量。
- 数据建模优化:避免过度嵌套和冗余数据。若有频繁关联查询,考虑适当冗余数据以减少关联操作,但要注意数据一致性维护。
ElasticSearch配置参数考量
- 内存配置:合理分配堆内存大小。一般不超过物理内存的50%,且不超过32GB(避免JVM指针压缩问题)。调整堆外内存设置,以满足搜索和索引操作的需求。
- 线程池配置:根据业务负载调整不同线程池的参数,如
search
线程池、index
线程池。增加线程数量或调整队列大小,以适应高并发查询和写入操作。 - 搜索相关性配置:优化相关性算法配置,例如调整
BM25
算法的参数,以在满足业务需求的同时提升查询性能。 - 缓存配置:启用和配置查询缓存,如
filter cache
和field data cache
,合理设置缓存大小和过期时间,缓存经常使用的查询结果和字段数据,减少重复计算。