Mapping——ES官方文档学习

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 datatypes


就是一般类型、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"
        }
      }
    }
  }
}

大概解释一下,索引名字是my_index,mapping type名字是doc,下面properties里面就是一堆字段,date类型还设置了格式

发表评论

电子邮件地址不会被公开。