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可以纯手写,但是为了方便一般按照如下步骤创建。

  1. 创建一个临时的索引,写入一些样本数据。
  2. 访问mapping API获得临时索引的动态mapping的定义
  3. 对其不符合期待的部分进行修改后,用来创建自己的索引
  4. 删除临时索引。

常见参数

  • 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