动态字段映射
当 Elasticsearch 在文档中检测到新字段时,默认情况下它会动态地将该字段添加到类型映射中。dynamic 参数控制此行为。
你可以通过将 dynamic 参数设置为 true 或 runtime,显式指示 Elasticsearch 根据传入的文档动态创建字段。启用动态字段映射后,Elasticsearch 会使用下表中的规则来确定如何为每个字段映射数据类型。
下表中的字段数据类型是 Elasticsearch 唯一可以动态检测的字段数据类型。对于所有其他数据类型,你必须显式映射。
| JSON 数据类型 | Elasticsearch 数据类型 ( "dynamic":"true") |
Elasticsearch 数据类型 ( "dynamic":"runtime") |
|---|---|---|
null |
不添加字段 | 不添加字段 |
true 或 false |
boolean |
boolean |
double |
float |
double |
long |
long |
long |
object |
object |
不添加字段 |
数组 |
取决于数组中第一个非 null 的值 |
取决于数组中第一个非 null 的值 |
通过日期检测的 string |
date |
date |
通过数值检测的 string |
float 或 long |
double 或 long |
未通过 date 检测或 numeric 检测的 string |
带有 .keyword 子字段的 text |
keyword |
你可以在文档级别和 object 级别禁用动态映射。将 dynamic 参数设置为 false 会忽略新字段,而设置为 strict 则会在 Elasticsearch 遇到未知字段时拒绝该文档。
使用 更新映射 API 来更新现有字段上的 dynamic 设置。
你可以为日期检测和数值检测自定义动态字段映射规则。要定义可应用于其他动态字段的自定义映射规则,请使用 dynamic_templates。
如果启用了 date_detection(默认),则会检查新的字符串字段,查看其内容是否与 dynamic_date_formats 中指定的任何日期模式匹配。如果找到匹配项,则会添加一个具有相应格式的新 date 字段。
dynamic_date_formats 的默认值为
[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
例如
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
GET my-index-000001/_mapping
可以通过将 date_detection 设置为 false 来禁用动态日期检测
PUT my-index-000001
{
"mappings": {
"date_detection": false
}
}
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
create_date字段已作为text字段添加。
或者,可以自定义 dynamic_date_formats 以支持你自己的 日期格式
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"]
}
}
PUT my-index-000001/_doc/1
{
"create_date": "09/25/2015"
}
配置日期模式数组与在单个字符串中配置用 || 分隔的多个模式是有区别的。当你配置日期模式数组时,第一个包含未映射日期字段的文档中匹配该日期的模式将决定该字段的映射
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": [ "yyyy/MM", "MM/dd/yyyy"]
}
}
PUT my-index-000001/_doc/1
{
"create_date": "09/25/2015"
}
生成的映射将是
{
"my-index-000001": {
"mappings": {
"dynamic_date_formats": [
"yyyy/MM",
"MM/dd/yyyy"
],
"properties": {
"create_date": {
"type": "date",
"format": "MM/dd/yyyy"
}
}
}
}
}
在单个字符串中配置用 || 分隔的多个模式会生成一个支持任何日期格式的映射。这使你能够索引使用不同格式的文档
PUT my-index-000001
{
"mappings": {
"dynamic_date_formats": [ "yyyy/MM||MM/dd/yyyy"]
}
}
PUT my-index-000001/_doc/1
{
"create_date": "09/25/2015"
}
生成的映射将是
{
"my-index-000001": {
"mappings": {
"dynamic_date_formats": [
"yyyy/MM||MM/dd/yyyy"
],
"properties": {
"create_date": {
"type": "date",
"format": "yyyy/MM||MM/dd/yyyy"
}
}
}
}
}
纪元格式 (epoch_millis 和 epoch_second) 不支持作为动态日期格式。
虽然 JSON 支持原生浮点数和整数数据类型,但某些应用程序或语言有时可能会将数字呈现为字符串。通常,正确的解决方案是显式映射这些字段,但可以启用数值检测(默认禁用)来自动完成此操作
PUT my-index-000001
{
"mappings": {
"numeric_detection": true
}
}
PUT my-index-000001/_doc/1
{
"my_float": "1.0",
"my_integer": "1"
}