Mapping--Dynamic Mapping
Dynamic Mapping
1. 概述
Elastisearch最重要的特征之一就是,它尝试跳出固有的方式,让你尽可能快地开始探索你的数据。为了索引一条文档,你不必先创建一个索引,然后定义字段和映射类型,你可以直接索引一条文档,索引,字段和字段类型会自动地被创建。
PUT data/_doc/1
{
"count": 5
}
自动创建index
索引,映射类型为_doc
,并且有一个数据类型为long
,名称为count
的字段
自动检测和添加新字段,被称为动态映射。你可以用以下参数自定义动态映射规则来满足你的目的:动态字段映射
: 控制动态字段检测的规则动态模板
: 自定义规则来配置动态添加的字段映射
TIP
: 无论是自动创建还是显式创建索引,索引模板都允许你为新索引配置默认的映射,设置和别名。
2. 动态字段映射
默认地,当一个之前没有见过的字段出现在了一条文档中,Elasticsearch会将这个字段添加到类型映射中。可以通过将dynamic
参数设置为false(忽略新字段,索引其他已知字段)或者strict(在遇到未知字段时拒绝索引这条文档,并且抛出异常),在文档和对象层面,禁用这种动态添加字段的行为。
假设dynamic
映射参数被启用(=true), 一些简单的规则被用来决定一个新的字段应该被设置为哪种es的字段类型:
JSON 数据类型 | Elasticsearch 数据类型 |
---|---|
null | 不添加该字段 |
true 或 false | boolean类型字段 |
浮点数 | float类型字段 |
整数 | long类型字段 |
对象 | object类型字段 |
数组 | 取决于数组中的第一个不为null值的类型 |
字符串 | 以下四种类型之一,date类型的字段(如果通过日期检查), double或float类型的字段(如果通过数字检查),text类型的字段(并且带一个类型为keyword的子字段) |
这些是仅有的可以动态检查并添加的字段数据类型,所有其他的数据类型必须被明确的定义在映射类型中。
除了以下列出来的选项,动态字段映射规则可以在动态模板中被进一步自定义:
2.1 日期检查
如果启用日期检查—date_detection=true
(默认),然后新的字符串字段的内容会被检查是否匹配任何dynamic_date_formats
中指定的日期格式,如果发现了匹配,一个新的日期类型的字段将会以对应的格式被添加进映射类型中。dynamic_date_formats
的默认值为:
[“strict_date_optional_time”, “yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z”]
比如:
PUT my_index/_doc/1
{
"create_date": "2015/09/02"
}
GET my_index/_mapping
{
"my_index" : {
"mappings" : {
"properties" : {
"create_date" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
}
}
}
}
}
create_date字段已经以date类型被添加进了映射类型中,并且它的格式是:
"yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
2.2 禁用日期检查
通过将date_detection
设置为false, 动态日期检查就会被禁用:
PUT my_index
{
"mappings": {
"date_detection": false
}
}
PUT my_index/_doc/1
{
"create_date": "2015/09/02"
}
GET my_index/_mapping
response:
{
"my_index" : {
"mappings" : {
"date_detection" : false,
"properties" : {
"create_date" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
create_date字段以text类型被添加
2.3 自定义日期检查格式
另外,dynamic_date_formats
可以被自定义来支持你自己的日期格式
PUT my_index
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
PUT my_index/_doc/1
{
"create_date": "09/25/2015"
}
GET my_index/_mapping
{
"my_index" : {
"mappings" : {
"dynamic_date_formats" : [
"MM/dd/yyyy"
],
"properties" : {
"create_date" : {
"type" : "date",
"format" : "MM/dd/yyyy"
}
}
}
}
}
2.4 数字检查
虽然JSON已经支持原生的浮点型和整型的数据类型,但是一些应用或语言有时可能会将数字渲染为数字串,通常正确的解决方法是显式地映射这些字段,但是数字检查(默认被禁用)可以被启动来自动完成这种映射:
PUT my_index
{
"mappings": {
"numeric_detection": true
}
}
PUT my_index/_doc/1
{
"my_float": "1.0",
"my_integer": "1"
}
GET my_index/_mapping
response:
{
"my_index" : {
"mappings" : {
"numeric_detection" : true,
"properties" : {
"my_float" : {
"type" : "float"
},
"my_integer" : {
"type" : "long"
}
}
}
}
}
my_float字段被映射为float类型
my_integer字段被映射为long类型
3. 动态模板
- 动态模板允许你根据以下参数定义可应用于动态添加字段的定制的映射规则:
-
- 利用
match_mapping_type
参数,Elasticsearch进行数据类型检查
- 利用
-
- 利用
match和unmatch
或match_pattern
参数,控制匹配的字段名称
- 利用
-
- 利用
path_match
和`path_unmatch,控制匹配的点语法的全字段路径
- 利用
原始字段名{name}
和被检查到的数据类型{dynamic_type
这两个模板变量,可以作为占位符用在映射规范中
IMPORTANT:
动态字段映射仅会在字段包含一个具体的值(不为null或空数组)的时候被添加。
这意味着dynamic_template中使用了null_value选项,
只有第一个带有具体值的相应字段的文档被索引之后,null_value选项才会起作用
动态模板被指定为元素为命名对象的数组:
"dynamic_templatee": [
{
"my_template_name": {
... match conditions ...
"mappng": {
...类型定义和可选的参数...
}
}
},
...
]
1.my_template_name 可以是任何字符串的值
2.匹配条件可以是以下任何参数的组合: match_mapping_type、match、match_pattern、unmatch、
path_match、path_unmatch
3.mapping就是被匹配到字段应该使用的映射定义
推荐阅读
-
ElasticStack学习(七):ElasticSearch之Mapping初探
-
Mybatis映射赋值失败;异常:TypeException: Could not set parameters for mapping
-
详解 hibernate mapping配置
-
【Flask】报错解决方法:AssertionError: View function mapping is overwriting an existing endpoint function: main.user
-
Hibernate 中的 idclass mapping 问题
-
ES 11 - 配置Elasticsearch的映射(mapping)
-
mybatis-generator自动生成dao、mapping、bean配置操作
-
HibernateTools实现pojo类 数据库schma mapping映射的相互转换
-
servlet url mapping规则
-
Glide java.io.IOException(File unsuitable for memory mapping)