面试题答案
一键面试索引设置优化
- 字段类型选择:对于高基数文本字段,避免使用
text
类型进行聚合。因为text
类型在索引时会进行分词,不利于精确聚合。可考虑使用keyword
类型,它会将整个文本作为一个词项进行索引,适合精确匹配和聚合操作。例如,如果是处理商品名称这类高基数文本,将其字段类型设为keyword
。 - 倒排索引优化:通过调整
index
参数,例如对于一些不需要进行搜索,仅用于聚合的字段,可以将index
设为false
,减少索引开销。此外,适当调整index_options
参数,如对于只关注文档频率的场景,可将其设为docs
,这样只记录文档号,而不记录词频和位置信息,能显著减小索引大小,提升性能。 - 索引分片调整:合理分配索引的分片数量。分片过多会增加管理开销和网络传输负担,分片过少则可能导致单个分片数据量过大,影响性能。根据数据量和集群资源,通过测试找到最优的分片数量。比如,对于数据量增长较稳定且规模不是特别巨大的情况,每个分片保持在数GB到数十GB的量级比较合适。
查询参数优化
- 控制返回结果数量:在聚合查询时,利用
size
参数控制返回的聚合桶数量。如果只需要获取前几个聚合结果,设置一个较小的size
值,如size=10
,避免返回大量不必要的数据,减少网络传输和处理时间。 - 缓存控制:利用Elasticsearch的查询缓存机制,对于频繁执行的相同聚合查询,可以开启缓存,通过设置
_cache
参数为true
来启用。这样相同的查询再次执行时,直接从缓存中获取结果,提升查询性能。
聚合方式调整
- 使用Composite聚合:Composite聚合适合处理高基数数据,它通过分页的方式逐步返回聚合结果,避免一次性处理大量数据导致的性能问题。例如,对于高基数的用户ID聚合,可以使用Composite聚合进行分页获取结果,每次只处理一部分数据。
- 基于脚本的聚合:在某些场景下,使用脚本进行聚合可以更灵活地对数据进行处理,并且通过优化脚本逻辑,可以提升聚合性能。比如,对于复杂的数值计算聚合,可以编写高效的脚本,减少不必要的中间计算过程。同时,注意在脚本中合理使用缓存机制,避免重复计算。