Elasticsearch 索引——动态映射
参考文档
- Elasticsearch: 权威指南 ? 基础入门 ? 索引管理
- Elasticsearch: 权威指南 ? 基础入门 ? 索引管理 ? 自定义动态映射
动态映射
当 Elasticsearch 遇到文档中以前未遇到的字段,它用 dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射。
有时我们不想这样做,我们可以用 dynamic 配置来控制这种行为:
- true 动态添加新的字段——缺省
- false 忽略新的字段
- strict 如果遇到新字段抛出异常
配置参数 dynamic 可以用在根 object 或者任何 object 类型的字段上。我们可以将 dynamic 的默认值设置为 strict,并且只在指定的内部对象中开启 它,例如:
curl -X PUT "localhost:9200/my_index?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"title": { "type": "string"},
"stash": {
"type": "object",
"dynamic": true
}
}
}
}
}
'
- 如果遇到新字段,对象 my_type 就会抛出异常。
- 而内部对象 stash 遇到新字段就会动态创建新字段。
自定义动态映射
如果你想在运行时增加新的字段,你可能会启用动态映射。然后有时候,动态映射规则可能不太智能。幸运的是,我们可以通过设置去自定义这些规则,以便更好的 适用于你的数据。
日期检测
当 Elasticsearch 遇到一个新的字符串字段时,它会检测这个字段是否包含一个可识别的日期,比如 2014-01-01,如果它像日期,这个字段就会被作为 date 类型添加。否则,它会被作为 string 类型添加。
有些时候这个行为可能导致一些问题。想象下,你有如下这样的一个文档。
{ "note": "2014-01-01" }
假设这是第一次识别 note 字段,它会被添加为 date 字段。但是如果下一个字段像这样:
{ "note": "Logged out" }
这显然不是一个日期,但为时已晚。这个字段已经是一个日期类型,这个不合法的日期将会造成一个异常。
日期检测可以通过在根对象上设置 date_detection 为 false 来关闭:
PUT /my_index
{
"mappings": {
"my_type": {
"date_detection": false
}
}
}
使用这个映射,字符串将始终作为 string 类型。如果你需要一个 date 字段,你必须手动添加。
|