ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引、类型等信息,在索引的同时会自动完成索引、类型、映射的创建。

那么什么是映射呢?映射就是描述字段的类型、如何进行分析、如何进行索引等内容。

本篇就着重讲述下,ES中映射的自动检测特性。

更多内容参考:​​Elastisearch知识总结​

字段自动检测

在某个字段第一次出现时,如果之前没有定义过映射,ES会自动检测它可能满足的类型,然后创建对应的映射。


JSON数据



ES中的数据类型



null



不会添加字段



true or ​false​



boolean



floating point number



double



integer



long



object



object



array



依赖于第一个非null得值



string



如果通过了date检测,则为date

如果通过了numeric检测,则为Number


上面就是类型自动检测的结果,除了上面列出的基本类型,其他的高级的类型比如geo,ip就需要手动指定了。

日期自动检测

日期自动检测,即date_detection是默认开启的,因此只要符合默认的日期格式,就可以自动创建成date类型

日期的格式为:



[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]


例如:



$ curl -XPUT localhost:9200/test/test/1 -d '{"create":"2015/11/11"}'
{"_index":"test","_type":"test","_id":"1","_version":1,"created":true}

$ curl -XGET localhost:9200/test/_mapping?pretty
{
"test" : {
"mappings" : {
"test" : {
"properties" : {
"create" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd"
}
}
}
}
}
}


可以通过修改​​dynamic_date_formats​​ 修改日期格式:



PUT my_index
{
"mappings":{
“my_type":{"dynamic_date_formats":["MM/dd/yyyy"]}
}
}

PUT my_index/my_type/1{"create_date":"09/25/2015"}


数字自动检测

数字自动检测,即numeric_detection默认是关闭的。因此需要手动打开:



PUT my_index
{"mappings":{"my_type":{"numeric_detection":true}}}


当执行索引操作时,如果符合float型,就会自动创建为float

Elasticsearch 动态映射——自动检测_字段提升

long型也是一样:

Elasticsearch 动态映射——自动检测_elasticsearch_02