Mapping--映射

2020-06-01 00:00:00 索引 字段 添加 类型 映射

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"
        }
      }
    }
  }
}

相关文章