动态字段映射编辑

默认情况下,当 Elasticsearch 在文档中检测到新字段时,它会_动态地_将该字段添加到类型映射中。 dynamic 参数控制此行为。

您可以通过将 dynamic 参数设置为 trueruntime,明确指示 Elasticsearch 根据传入的文档动态创建字段。启用动态字段映射后,Elasticsearch 使用下表中的规则来确定如何为每个字段映射数据类型。

下表中的字段数据类型是 Elasticsearch 动态检测到的唯一 字段数据类型。您必须显式映射所有其他数据类型。

Elasticsearch 数据类型

JSON 数据类型

"dynamic":"true"

"dynamic":"runtime"

null

不添加字段

不添加字段

truefalse

boolean

boolean

double

float

double

long

long

long

object

object

不添加字段

array

取决于数组中第一个非 null 的值

取决于数组中第一个非 null 的值

通过 日期检测string

date

date

通过 数字检测string

floatlong

doublelong

未通过 date 检测或 numeric 检测的 string

带有 .keyword 子字段的 text

keyword

您可以在文档和 object 级别禁用动态映射。将 dynamic 参数设置为 false 会忽略新字段,如果 Elasticsearch 遇到未知字段,则 strict 会拒绝该文档。

使用 更新映射 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"]

例如

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    create_date: '2015/09/02'
  }
)
puts response

response = client.indices.get_mapping(
  index: 'my-index-000001'
)
puts response
PUT my-index-000001/_doc/1
{
  "create_date": "2015/09/02"
}

GET my-index-000001/_mapping 

create_date 字段已作为 date 字段添加,格式为 format
"yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z".

禁用日期检测编辑

可以通过将 date_detection 设置为 false 来禁用动态日期检测

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      date_detection: false
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    create_date: '2015/09/02'
  }
)
puts response
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 以支持您自己的 日期格式

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      dynamic_date_formats: [
        'MM/dd/yyyy'
      ]
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    create_date: '09/25/2015'
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}

PUT my-index-000001/_doc/1
{
  "create_date": "09/25/2015"
}

配置日期模式数组和在以 || 分隔的单个字符串中配置多个模式之间存在差异。当您配置日期模式数组时,与第一个文档中具有未映射日期字段的日期匹配的模式将确定该字段的映射

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      dynamic_date_formats: [
        'yyyy/MM',
        'MM/dd/yyyy'
      ]
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    create_date: '09/25/2015'
  }
)
puts response
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"
        }
      }
    }
  }
}

在以 || 分隔的单个字符串中配置多个模式会导致映射支持任何日期格式。这使您能够索引使用不同格式的文档

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      dynamic_date_formats: [
        'yyyy/MM||MM/dd/yyyy'
      ]
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    create_date: '09/25/2015'
  }
)
puts response
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_millisepoch_second)不支持作为动态日期格式。

数字检测编辑

虽然 JSON 支持原生浮点数和整数数据类型,但某些应用程序或语言有时可能会将数字渲染为字符串。通常,正确的解决方案是显式映射这些字段,但可以启用数字检测(默认情况下禁用)来自动执行此操作

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      numeric_detection: true
    }
  }
)
puts response

response = client.index(
  index: 'my-index-000001',
  id: 1,
  body: {
    my_float: '1.0',
    my_integer: '1'
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "numeric_detection": true
  }
}

PUT my-index-000001/_doc/1
{
  "my_float":   "1.0", 
  "my_integer": "1" 
}

my_float 字段已作为 float 字段添加。

my_integer 字段已作为 long 字段添加。