MST

星途 面试题库

面试题:ElasticSearch多索引API性能优化之索引设计

在使用ElasticSearch多索引API时,索引的设计对性能影响较大。请阐述如何从索引的字段类型、映射设置方面进行优化,以提升多索引API的性能?
22.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

字段类型优化

  1. 选择合适的数据类型
    • 数值类型:对于整数,根据实际取值范围选择合适的类型,如 byte(-128 到 127)、short(-32768 到 32767)、integer(-2147483648 到 2147483647)、long(更大范围整数)。避免使用过大类型,如能用 integer 就不用 long,这样可以减少存储空间,提升查询性能。对于浮点数,float 适用于一般精度要求,double 用于高精度需求,同样按需选择。
    • 日期类型:使用 date 类型存储日期和时间,Elasticsearch 支持多种日期格式。确保日期格式正确,且在索引和查询时保持一致,可利用 date_format 映射参数指定格式,以提高解析效率。
    • 文本类型:对于需要全文搜索的文本字段,使用 text 类型,并结合合适的分析器(如 standardik_max_word 等中文分析器)进行分词。对于不需要全文搜索,仅用于排序、聚合或精确匹配的字符串字段,使用 keyword 类型。例如,商品的分类字段,如果仅用于分组聚合,用 keyword 类型更合适。
  2. 避免冗余字段
    • 尽量不要在索引中存储重复或可推导的数据。例如,如果有一个包含完整地址的字段,又单独创建省份、城市等字段,在更新地址时就需要同时更新多个字段,增加了维护成本和索引大小。如果确实需要按省份、城市等进行查询,可以通过 text 类型结合合适的分词策略来实现。

映射设置优化

  1. 动态映射与静态映射
    • 动态映射:Elasticsearch 默认开启动态映射,当文档中的字段首次出现时会自动为其添加映射。但动态映射可能会导致一些性能问题,比如误判字段类型。在生产环境中,建议尽量使用静态映射,即提前定义好索引的映射结构。这样可以避免动态映射带来的不确定性,提高索引性能和稳定性。
    • 动态模板:如果部分字段需要动态映射,可以使用动态模板来控制动态映射的规则。例如,可以定义模板,使以 _id 结尾的字段都映射为 keyword 类型,以满足特定的业务需求,同时又能一定程度上控制动态映射行为。
  2. 字段的索引属性设置
    • index 属性:对于不需要进行搜索的字段,将其 index 属性设置为 false。例如,一些内部使用的标记字段,仅用于程序逻辑判断,不参与搜索,设置为 index: false 可以减少索引构建的开销,提升索引性能。
    • doc_values 属性:对于需要进行排序、聚合或地理位置查询的字段,确保 doc_values 属性为 true(默认对于大多数数据类型是 true)。doc_values 是一种在磁盘上存储的列式数据结构,能有效提升这些操作的性能。但对于 text 类型字段,默认是不开启 doc_values 的,因为全文搜索通常不需要排序和聚合,如果确实有需求,可以通过特殊设置开启,但会增加磁盘空间占用。
  3. 索引的分片与副本设置
    • 分片数量:根据数据量和硬件资源合理设置分片数量。分片过多会增加索引管理开销(如每个分片都有自己的文件句柄、内存等资源消耗),且可能导致搜索性能下降;分片过少则无法充分利用集群资源,影响数据的并行处理能力。一般建议先从小的分片数量开始,随着数据量增长再动态调整。例如,对于较小规模的数据集(几百万条记录),可以先设置 3 - 5 个分片。
    • 副本数量:副本主要用于提高系统的高可用性和读性能。但副本过多会增加数据写入的负担,因为每次写入都需要同步到所有副本。在生产环境中,根据业务需求和硬件资源设置副本数量,通常 1 - 2 个副本较为常见。如果读操作远多于写操作,可以适当增加副本数量。