Mapping--映射
mapping这部分的官方说明
Mapping是用来定义一个文档及其字段如何进行存储和索引的。 使用Mapping可以定义: String字段应视为full text还是keyword 字段设为数字、日期或地理位置类型 日期类型的值格式化 自定义规则以控制动态添加字段的映射
Mapping type
6.0以后每个索引都只有一个映射的Type,由这个type决定文档如何被索引。 一个Mapping type通常由两部分组成,Meta-fields和Fields or properties 元数据主要是_index, _type, _id, _source这四个字段 fields就是一组field(属性-值)
Field data*
就是一般类型、Json层次嵌套结构的类型和专门的类型 很多时候,由于不同目的会用不同的方式去对同一个字段创建索引。比如一个字符串存的text会被分词,如果不需要分词,应该存成keyword,而且数值类型如果不是要计算或者range而是像string一样查询,也应该存成keyword。keyword也可以用来sorting或者aggregations操作。
Settings to prevent mappings explosion
在索引中定义太多的字段会导致映射爆炸,这会导致内存不足错误和难以恢复的情况。这种问题很普遍,如果文档出现了新字段去建立索引,由于动态映射所以直接会被加进去。要是太多肯定有问题,说明里有解决方案,遇到这种问题的时候再说。
Dynamic mapping
字段和映射类型不需要在put之前定义。由于动态映射,就算只有一个文档有这个字段,新的字段名也会被自动添加。 新字段既可以添加到顶层映射类型,也可以添加到内部Object和nested嵌套字段中。 可以设置动态映射规则,定制用于新字段的映射。
Explicit mappings
显式映射,假如你知道更多你的数据结构什么样子,就不需要ES猜测然后去动态映射,所以一般新手不知道mapping如何构建,使用动态映射。 但是肯定是推荐指定你自己的显式映射 可以在创建索引前创建Mapping,并且可以使用PUT mapping API将字段添加到现有索引中。
一个mapping的例子
PUT my_index
{
"mappings": {
"doc": {
"properties": {
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
相关文章