ES[7.6.x]学习笔记(五)动态映射

通常情况下,咱们运用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_floatmy_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中一个非常重要的功用,它给咱们带来了极大的便利,也省去了咱们在开发时创立索引字段的时刻,真是事半功倍,小伙伴们要好好把握哦~~