欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mapping--Dynamic Mapping

程序员文章站 2022-07-15 13:11:40
...

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和unmatchmatch_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就是被匹配到字段应该使用的映射定义