面试题答案
一键面试索引方面
- 可能原因:
- 分片数量不合理:分片过多,会导致每个分片数据量过小,增加了索引和搜索时的开销;分片过少,可能导致单个分片数据量过大,影响查询性能。
- 副本数量过多:副本数量过多会占用过多的网络和磁盘I/O资源,在高并发搜索时,可能会因为资源竞争导致搜索延迟。
- 索引字段类型设置不当:例如将日期字段设置为字符串类型,会导致在搜索时无法利用日期类型的高效查询特性。
- 索引数据倾斜:部分分片的数据量远大于其他分片,导致搜索时负载不均衡。
- 优化措施:
- 调整分片数量:根据数据量和集群规模,估算合适的分片数量。一般可以参考每个分片15GB - 50GB数据量的经验值,然后根据实际情况进行调整。可以使用
_cat/shards
API查看分片状态。 - 优化副本数量:根据业务需求和集群的容灾要求,适当减少副本数量。例如在高并发读场景下,可以将副本数量设置为1,以减少资源占用。通过
PUT /{index}/_settings
API修改副本数量。 - 修正字段类型:确保字段类型与实际数据类型匹配,利用Elasticsearch内置的数据类型优化搜索性能。可以使用
PUT /{index}/_mapping
API更新字段映射。 - 解决数据倾斜:可以通过重新规划数据路由,或者使用
_reindex
API对数据进行重新分配,使数据分布更加均匀。
- 调整分片数量:根据数据量和集群规模,估算合适的分片数量。一般可以参考每个分片15GB - 50GB数据量的经验值,然后根据实际情况进行调整。可以使用
搜索方面
- 可能原因:
- 查询语句复杂度过高:例如使用了多层嵌套的布尔查询,或者在查询中包含大量的通配符查询,会增加查询的计算量。
- 未使用合适的查询类型:比如对文本字段使用了
term
查询,而没有使用match
查询,导致无法利用分词器进行高效查询。 - 排序字段不合理:如果对高基数(唯一值较多)字段进行排序,会增加排序的开销。
- 未使用缓存:频繁执行相同的查询,却没有利用Elasticsearch的查询缓存机制。
- 优化措施:
- 简化查询语句:尽量避免复杂的嵌套查询,将复杂查询拆分成多个简单查询。对于通配符查询,尽量使用前缀查询替代,因为前缀查询可以利用倒排索引。
- 选择合适的查询类型:根据字段类型和业务需求,选择正确的查询类型。例如对文本字段使用
match
查询,对精确匹配字段使用term
查询。 - 优化排序字段:优先选择低基数字段进行排序,或者对高基数字段进行聚合后再排序。
- 启用查询缓存:可以通过设置
indices.queries.cache.enable: true
启用查询缓存,并根据业务情况调整缓存大小,例如indices.queries.cache.size: 10%
。还可以通过_cache/clear
API清理缓存。