我们一开始线上ES采用的默认动态mapping,每个字段都默认有一个子字段,导致每天的磁盘占用居高不下,不得不进行优化,在对我们业务进行分析后,我们逐渐发现有些字段我们是永远不会搜索的、也不会进行聚合所以我们针对mapping文件每个字段的数据进行优化。最后优化的结果就是数据的磁盘占用降低了至少42%。
PUT my_index
{
"mappings":{
"doc":{
"properties":{
"field_1":{
"type":"keyword",
"norms":false
},
"field_2":{
"enabled":false
},
"field_3":{
"index":false
}
}
}
}
}
一般像这种情况一开始数据建模的时候就应该考虑到位,但是我们由于时间紧迫以及对ES的技术没有掌握全面所以直接上马,最后业务稳定了开始考虑优化,以下是我总结的经验:
1、数据建模时首先考虑字段的类型以及是否需要子字段,再次考虑是否需要搜索,再次考虑是否要聚合以及排序,最后考虑是否要额外的存储;
2、不需要搜索index=false,不需要算分 norms= false,不需要聚合和排序 Doc_values=false,不需要搜索也不需要聚合 enable= false