MST
星途 面试题库

面试题:ElasticSearch索引和搜索协同优化之性能调优

假设在一个高并发的搜索场景下,ElasticSearch集群出现搜索延迟较高的问题。从索引和搜索两方面阐述可能的原因及对应的优化措施,例如索引的分片、副本设置,搜索的查询语句优化等。
23.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

索引方面

  1. 可能原因
    • 分片数量不合理:分片过多,会导致每个分片数据量过小,增加了索引和搜索时的开销;分片过少,可能导致单个分片数据量过大,影响查询性能。
    • 副本数量过多:副本数量过多会占用过多的网络和磁盘I/O资源,在高并发搜索时,可能会因为资源竞争导致搜索延迟。
    • 索引字段类型设置不当:例如将日期字段设置为字符串类型,会导致在搜索时无法利用日期类型的高效查询特性。
    • 索引数据倾斜:部分分片的数据量远大于其他分片,导致搜索时负载不均衡。
  2. 优化措施
    • 调整分片数量:根据数据量和集群规模,估算合适的分片数量。一般可以参考每个分片15GB - 50GB数据量的经验值,然后根据实际情况进行调整。可以使用_cat/shards API查看分片状态。
    • 优化副本数量:根据业务需求和集群的容灾要求,适当减少副本数量。例如在高并发读场景下,可以将副本数量设置为1,以减少资源占用。通过PUT /{index}/_settings API修改副本数量。
    • 修正字段类型:确保字段类型与实际数据类型匹配,利用Elasticsearch内置的数据类型优化搜索性能。可以使用PUT /{index}/_mapping API更新字段映射。
    • 解决数据倾斜:可以通过重新规划数据路由,或者使用_reindex API对数据进行重新分配,使数据分布更加均匀。

搜索方面

  1. 可能原因
    • 查询语句复杂度过高:例如使用了多层嵌套的布尔查询,或者在查询中包含大量的通配符查询,会增加查询的计算量。
    • 未使用合适的查询类型:比如对文本字段使用了term查询,而没有使用match查询,导致无法利用分词器进行高效查询。
    • 排序字段不合理:如果对高基数(唯一值较多)字段进行排序,会增加排序的开销。
    • 未使用缓存:频繁执行相同的查询,却没有利用Elasticsearch的查询缓存机制。
  2. 优化措施
    • 简化查询语句:尽量避免复杂的嵌套查询,将复杂查询拆分成多个简单查询。对于通配符查询,尽量使用前缀查询替代,因为前缀查询可以利用倒排索引。
    • 选择合适的查询类型:根据字段类型和业务需求,选择正确的查询类型。例如对文本字段使用match查询,对精确匹配字段使用term查询。
    • 优化排序字段:优先选择低基数字段进行排序,或者对高基数字段进行聚合后再排序。
    • 启用查询缓存:可以通过设置indices.queries.cache.enable: true启用查询缓存,并根据业务情况调整缓存大小,例如indices.queries.cache.size: 10% 。还可以通过_cache/clear API清理缓存。