本节翻译自Elasticsearch2.4Mapping章节
Mapping是定义文档及其包含的字段如何存储和编入索引的过程。例如,使用mappings来定义:
Mapping Types
每个索引具有一个或多个映射类型,用于将索引中的文档划分为若干逻辑组。用户文档可能以”user”类型存储,博客帖子以”blogpost”类型存储。
每个映射类型都有:
Meta-fields(元字段)
Fields or properties(字段或属性)
每个映射类型都包含一组与该类型相关的字段或属性的列表。”user”类型可能包含title,name和age字段,而”blogpost”类型可能包含title,body,user_id和created的字段。在同一索引中不同映射类型中具有相同名称的字段必须具有相同的映射(must have the same mapping)。
IMPORTANT NOTES
在Elasticsearch版本2.0 - 2.3中,field中不允许使用圆点。Elasticsearch2.4添加了允许使用圆点的设置,但是应谨慎使用此设置。有关详细信息,请参阅字段名称中的点(Dots in field names)。
Field dataTypes
每个字段都有一个数据类型,可以是:
- 一个简单的类型,如string,date,long,double,boolean或ip。
- 一种支持JSON的层次化属性(如object或nested)的类型。
- 或类似geo_point,geo_shape或completion类型。
以不同的方式为不同的目的索引相同的字段通常是有用处的。例如,string field可以索引为全文搜索的一个分析(analyed)字段,同时也可以作为用于排序或聚合的未分析(not_analyzed)字段。或者,您可以使用标准分析器(standard analyzer)、英语分析器(english)和法语(french analyzer)分析器索引字符串字段。
这是多字段(multi-fields)的目的。大多数数据类型通过fields参数支持多字段。
Dynamic mapping
fields和mapping类型在使用之前不需要定义。由于dynamic mapping,只需通过索引文档,新的mapping type和新的fields名称将被自动添加。新字段可以添加到顶级映射类型,以及内部对象(object)和嵌套(nested)字段。
动态映射规则可以配置为定制用于新类型和新字段的映射。
Explicit Mapping(显式映射)
你肯定比Elasticsearch更了解你的数据,所以,虽然动态映射开始是有用的,但是在某些时候你可能想要指定自己的“显式映射”。
你可以在创建索引时创建映射类型和字段映射,并且可以使用PUT mapping API将映射类型和字段添加到现有索引。
Updating existing mappings
除了文档化的,现有的类型和字段映射不能被更新。更改映射意味着使已索引的文档无效。相反,你应该使用正确的映射创建一个新索引,并将您的数据重新索引到该索引中。
Fields are shared across mapping types(字段在映射类型之间共享)
Mapping types用于对字段进行分组,但每个mapping type中的字段不是彼此独立的。Field With:
- 同名
- 在同一索引中
- 在不同的映射类型
- 内部映射到相同的字段
- 并且必须具有相同的映射
如果user和blogpost映射类型中都存在title字段,则标题字段必须在每种类型中具有完全相同的映射。
此规则的唯一例外是copy_to,dynamic,enabled,ignore_above,include_in_all和properties参数,每个字段可能有不同的设置。
通常,具有相同名称的字段也包含相同类型的数据,因此具有相同的映射不是问题。当冲突确实出现时,可以通过选择更具描述性的名称来解决这些问题,例如user_title and blog_title。
Example Mapping
可以在创建索引时指定上述示例的映射,如下所示:
PUT my_index 1
{
"mappings": {
"user": { 2
"_all": { "enabled": false }, 3
"properties": { 4
"title": { "type": "string" }, 5
"name": { "type": "string" }, 6
"age": { "type": "integer" } 7
}
},
"blogpost": { 8
"properties": { 9
"title": { "type": "string" }, 10
"body": { "type": "string" }, 11
"user_id": {
"type": "string", 12
"index": "not_analyzed"
},
"created": {
"type": "date", 13
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
1.创建一个名为my_index的索引。
2.添加名为user和blogpost的映射类型。
3.为用户映射类型禁用_all元字段。
4.在每个映射类型中指定字段或属性。
5.指定每个字段的数据类型和映射。