面试题答案
一键面试字段类型优化
- 选择合适的数据类型
- 数值类型:对于整数,根据实际取值范围选择合适的类型,如
byte
(-128 到 127)、short
(-32768 到 32767)、integer
(-2147483648 到 2147483647)、long
(更大范围整数)。避免使用过大类型,如能用integer
就不用long
,这样可以减少存储空间,提升查询性能。对于浮点数,float
适用于一般精度要求,double
用于高精度需求,同样按需选择。 - 日期类型:使用
date
类型存储日期和时间,Elasticsearch 支持多种日期格式。确保日期格式正确,且在索引和查询时保持一致,可利用date_format
映射参数指定格式,以提高解析效率。 - 文本类型:对于需要全文搜索的文本字段,使用
text
类型,并结合合适的分析器(如standard
、ik_max_word
等中文分析器)进行分词。对于不需要全文搜索,仅用于排序、聚合或精确匹配的字符串字段,使用keyword
类型。例如,商品的分类字段,如果仅用于分组聚合,用keyword
类型更合适。
- 数值类型:对于整数,根据实际取值范围选择合适的类型,如
- 避免冗余字段
- 尽量不要在索引中存储重复或可推导的数据。例如,如果有一个包含完整地址的字段,又单独创建省份、城市等字段,在更新地址时就需要同时更新多个字段,增加了维护成本和索引大小。如果确实需要按省份、城市等进行查询,可以通过
text
类型结合合适的分词策略来实现。
- 尽量不要在索引中存储重复或可推导的数据。例如,如果有一个包含完整地址的字段,又单独创建省份、城市等字段,在更新地址时就需要同时更新多个字段,增加了维护成本和索引大小。如果确实需要按省份、城市等进行查询,可以通过
映射设置优化
- 动态映射与静态映射
- 动态映射:Elasticsearch 默认开启动态映射,当文档中的字段首次出现时会自动为其添加映射。但动态映射可能会导致一些性能问题,比如误判字段类型。在生产环境中,建议尽量使用静态映射,即提前定义好索引的映射结构。这样可以避免动态映射带来的不确定性,提高索引性能和稳定性。
- 动态模板:如果部分字段需要动态映射,可以使用动态模板来控制动态映射的规则。例如,可以定义模板,使以
_id
结尾的字段都映射为keyword
类型,以满足特定的业务需求,同时又能一定程度上控制动态映射行为。
- 字段的索引属性设置
- index 属性:对于不需要进行搜索的字段,将其
index
属性设置为false
。例如,一些内部使用的标记字段,仅用于程序逻辑判断,不参与搜索,设置为index: false
可以减少索引构建的开销,提升索引性能。 - doc_values 属性:对于需要进行排序、聚合或地理位置查询的字段,确保
doc_values
属性为true
(默认对于大多数数据类型是true
)。doc_values
是一种在磁盘上存储的列式数据结构,能有效提升这些操作的性能。但对于text
类型字段,默认是不开启doc_values
的,因为全文搜索通常不需要排序和聚合,如果确实有需求,可以通过特殊设置开启,但会增加磁盘空间占用。
- index 属性:对于不需要进行搜索的字段,将其
- 索引的分片与副本设置
- 分片数量:根据数据量和硬件资源合理设置分片数量。分片过多会增加索引管理开销(如每个分片都有自己的文件句柄、内存等资源消耗),且可能导致搜索性能下降;分片过少则无法充分利用集群资源,影响数据的并行处理能力。一般建议先从小的分片数量开始,随着数据量增长再动态调整。例如,对于较小规模的数据集(几百万条记录),可以先设置 3 - 5 个分片。
- 副本数量:副本主要用于提高系统的高可用性和读性能。但副本过多会增加数据写入的负担,因为每次写入都需要同步到所有副本。在生产环境中,根据业务需求和硬件资源设置副本数量,通常 1 - 2 个副本较为常见。如果读操作远多于写操作,可以适当增加副本数量。