通常情况下,咱们运用ES树立索引的过程是,先创立索引,然后界说索引中的字段以及映射的类型,然后再向索引中导入数据。而动态映射是ES中一个非常重要的概念,你能够直接向文档中导入一条数据,与此同时,索引、字段、字段类型都会主动创立,无需你做其他的操作。这便是动态映射的奇特之处。
动态字段映射
ES的动态映射默许是敞开的,动态映射的默许规矩如下:
JSON的数据类型 | ES中的数据类型 |
---|---|
null | 不会映射字段 |
true 或 false | boolean类型 |
浮点型数字 | float |
整型数字 | long |
JSON目标 | Object |
数组 | 第一个非空值得类型 |
String | 1、假如满意日期类型的格局,映射为日期类型 |
2、假如满意数字型的格局,映射为long或许float | |
3、假如便是字符串,会映射为一个text类型和一个keyword类型 |
接下来咱们看看动态映射的一个比如,咱们直接向dynamic-index
索引中寄存一条数据,留意,dynamic-index
这个索引咱们没有创立过,直接寄存数据,索引会主动创立。接下来,咱们看一下详细的恳求:
PUT /dynamic-index/_doc/1
{
"my_null": null,
"my_boolean": false,
"my_float": 1.56,
"my_long": 3,
"my_object": {
"my_first": "first value",
"my_second": "second_value"
},
"my_array": [1,2,3],
"my_date_1": "2020-05-01",
"my_date_2": "2020/05/01 12:03:03",
"my_date_3": "05/01/2020",
"my_string_long": "1",
"my_string_float": "4.6",
"my_string": "中华人民共和国"
}
恳求履行成功今后,咱们先看一下索引的类型:
GET /dynamic-index/_mapping
回来的成果如下:
{
"dynamic-index": {
"mappings": {
"properties": {
"my_array": {
"type": "long"
},
"my_boolean": {
"type": "boolean"
},
"my_date_1": {
"type": "date"
},
"my_date_2": {
"type": "date",
"format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"my_date_3": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_float": {
"type": "float"
},
"my_long": {
"type": "long"
},
"my_object": {
"properties": {
"my_first": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_second": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"my_string": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_string_float": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_string_long": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
回来的成果比较长,咱们把每一个字段都看一下,看看动态映射的字段是否到达了咱们的预期:
字段 | 映射成果 | 是否到达预期 | 原因 |
---|---|---|---|
my_null | 没有映射 | 是 | null值不映射 |
my_boolean | boolean | 是 | |
my_float | float | 是 | |
my_long | long | 是 | |
my_object | object | 是 | my_object里主动生成了两个字段的映射 |
my_array | long | 是 | 数组中的数字是long型 |
my_date_1 | date | 是 | |
my_date_2 | date | 是 | |
my_date_3 | text | 否 | 没有指定这种日期格局,所以映射为text |
my_string_long | text | 否 | 数字勘探默许封闭,没有翻开 |
my_string_float | text | 否 | 数字勘探默许封闭,没有翻开 |
my_string | text | 是 | 一般字符串,映射为text |
下面咱们把数字勘探翻开,履行如下恳求:
PUT /dynamic-index
{
"mappings": {
"numeric_detection": true
}
}
因为咱们的索引dynamic-index
中,存在了映射联系,再进行设置是会报错的,所以咱们要将索引删去,履行如下恳求:
DELETE /dynamic-index
索引删去成功后,再履行前面的设置,履行成功,数字勘探现已翻开。然后再增加一种日期格局MM/dd/yyyy
,恳求如下:
PUT /dynamic-index
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
履行报错,错误信息和之前相同,看来日期的设置要和数字勘探一同才行,咱们再将索引删去,然后再发送恳求,两个设置一同:
PUT /dynamic-index
{
"mappings": {
"numeric_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
履行成功,咱们再发送之前创立索引数据的恳求
PUT /dynamic-index/_doc/1
{
"my_null": null,
"my_boolean": false,
"my_float": 1.56,
"my_long": 3,
"my_object": {
"my_first": "first value",
"my_second": "second_value"
},
"my_array": [1,2,3],
"my_date_1": "2020-05-01",
"my_date_2": "2020/05/01 12:03:03",
"my_date_3": "05/01/2020",
"my_string_long": "1",
"my_string_float": "4.6",
"my_string": "中华人民共和国"
}
履行成功,咱们再看一下索引的映射,
"my_string_float": {
"type": "float"
},
"my_string_long": {
"type": "long"
}
"my_date_1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_date_2": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"my_date_3": {
"type": "date",
"format": "MM/dd/yyyy"
},
咱们要点看一下以上几个字段,my_string_float
和my_string_long
映射成咱们想要的类型了,因为咱们敞开了数字勘探。再看看咱们映射的3个日期类型,咦?只要my_date_3
映射了日期类型,其他两个都是映射成了text类型,这是因为咱们在设置dynamic_date_formats
时,只指定了一种格局。咱们只需要把其他两种类型的日期格局也加上就能够了。
{
"mappings": {
"numeric_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd"]
}
}
这儿就不给咱们详细演示了,有爱好的小伙伴去测验一下把。
动态字段是ES中一个非常重要的功用,它给咱们带来了极大的便利,也省去了咱们在开发时创立索引字段的时刻,真是事半功倍,小伙伴们要好好把握哦~~
发表评论