Mapping
Mapping类似于数据库中schema的定义。定义索引中字段的名称、类型、相关配置。
将JSON文档映射成为lucene所需的扁平格式。
一个Mapping属于一个索引的Type。不过从ES7.0开始,一个索引只能由一个type,也可以说一个Mapping是属于一个索引的。
Dynamic Mapping
再写入文档的时候,如果索引不存在,会自动创建索引。 Dynamic Mapping的机制,让我们无需手动定义Mapping,ES会自动根据文档信息,推算出字段的类型。
但是也可能存在类型推导不正确的情况,这时可能会导致一些功能无法正常运行,如Range查询。
对于Mapping能否修改由以下情形:
- 新增字段。如果Dynamic设置为true,那么可以新增字段,同时更新Mapping。如果Dynamic为false,那么可以新增字段,但是不会修改Mapping,也意味着无法索引新增字段,只能显示在_source中。如果Dynamci如strict,文档写入会失败。
- 已有字段,一旦已经有数据写入,就不再支持更改。如果希望改变,就必须重建索引。
原因就在于:如果更新字段的类型,会导致已经建立的索引无效,所以禁止更新,但是新增字段不会影响。
显式定义Mapping
在创建索引的时候直接设置mapping即可。
PUT index
{
"mapping": {
}
}Mapping可以纯手写,但是为了方便一般按照如下步骤创建。
- 创建一个临时的索引,写入一些样本数据。
- 访问mapping API获得临时索引的动态mapping的定义
- 对其不符合期待的部分进行修改后,用来创建自己的索引
- 删除临时索引。
常见参数
- index:控制当前字段是否被索引。默认为true
PUT users
{
"mappings" : {
"properties": {
"mobile": {
"type": "text",
"index": false
}
}
}
}- index options:有四种级别,可以控制倒排索引记录的内容。
- docs - 记录doc id。
- freqs - 记录doc id和term frequencies
- positions - 记录doc id / term frequencies / term position
- offsets - 记录doc id / term frequencies / term position / character offset text类型默认记录positions,其它默认为docs。记录越多,占用空间越大。
PUT users
{
"mappings" : {
"properties": {
"mobile": {
"type": "text",
"index": false
},
"bio": {
"type": "text",
"index_options": "offsets"
}
}
}
}- copy_to:将字段的数值拷贝到目标字段,但是目标字段不会出现在_source中。
PUT users
{
"mappings" : {
"properties": {
"firstName": {
"type": "text",
"copy_to": "fullName"
},
"lastName": {
"type": "text",
"copy_to": "fullName"
}
}
}
}tags: ElasticSearch