es作为以倒排索引为基础实现的存储体系,不遵循关系型数据库中的范式约定,它的数据建模,是根据部署需求和性能需求的物理模型;而在这个建模的过程中,由于es是可以水平扩展的,可以存储到TB级以上的大数据的原因,他的一些预配置就显得尤其重要了,这关系到整个es的性能和查询效率。
—//—
类似于关系型数据库里面的表结构设计,es中对应的是mapping配置;这一章主要讲的就是mapping设置的时候的一些注意点。
mapping字段 的相关配置
名称 | 枚举 | 作用 |
---|---|---|
enable |
true/false | 仅存储,不做搜索和聚合分析 |
index |
true/false | 是否构建倒排索引,false不记录,即不可搜索 |
index_options |
docss/freqs/positions/offsets | 存储倒排索引的哪些信息,text类型默认配置为positions,其他默认为docs ,记录内容越多,占用空间越大。 |
norms |
true/false | 是否存储归一化的相关参数,如果字段仅用于过滤和聚合分析,可关闭 |
doc_values |
true/false | 是否开启,用于排序和聚合分析 |
field_data |
true/false | 是否为text类型启用,实现排序和聚合分析 |
store |
true/false | 是否存储该字段值 |
coerce |
true/false | 是否开启自动数据类型转换,比如字符串转数字,浮点转int(默认是true) |
multifields |
多字段:灵活使用多字段来解决多样的业务需求 | |
dynamic |
true/false/strict | 控制mapping的自动跟新 |
date_detection |
true/false | 是否自动识别日期类型 (建议false,手动去设置格式) |
Mapping字段属性的设定流程
判断是何种类型的字段
- 字符串类型:需要分词就设定为text,否则设定为keyword类型
- 枚举值类型:基于性能考虑设定成keyword类型,即便该数据为整型(比如状态码)
- 数值类型:尽量选择贴近的数据类型,比如byte即可表示所有数值的时候,选择byte,不要用long
- 其他类型:比如布尔类型,日期,地理数据等
判断该字段是否需要检索
- 完全不需要检索,排序,聚合分析的字段:
enable设置为false
- 不需要检索的字段:
index设置为false
- 需要检索的字段,可以根据如下的配置设定需要的存储力度:
index_options
: 结合需要设定norms
: 不需要归一化数据时关闭即可
- 是否需要排序和聚合分析?
不需要排序或者聚合分析功能:doc_values
设定为false;fielddata
设定为false 是否需要专门存储当前字段的数据?
store
设定为true,即可存储该字段的原始内容(与_source中的不相关) 一般结合_source的enabled
设定为false时使用其他建议
1.对mapping进行版本管理
包含在代码或者以专门的文件进行管理,添加好注释,并加入git等版本管理仓库中方便回顾
为每个增加一个metadata字段,在其中维护一些文档相关的元数据,方便对数据进行管理
{
"metadata":{
"version":1
},
"username":"alfred",
"job":"engineer"
}
#mapping版本,可以自行制定,比如每次更新mapping设置后,该version加1
2.防止字段过多
字段过多:难于维护,当字段成百上千时,基本很难有人明确知道每个字段的含义;mapping的信息存储在cluster state里面,过多的字段会导致mapping过大,最终导致更新变慢。</