动态字段映射

编辑

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

您可以显式地指示 Elasticsearch 基于传入的文档动态创建字段,方法是将 dynamic 参数设置为 trueruntime。当启用动态字段映射时,Elasticsearch 使用下表中的规则来确定每个字段的数据类型映射方式。

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

Elasticsearch 数据类型

JSON 数据类型

"dynamic":"true"

"dynamic":"runtime"

null

不添加字段

不添加字段

truefalse

布尔值

布尔值

双精度浮点数

单精度浮点数

双精度浮点数

长整型

长整型

长整型

对象

对象

不添加字段

数组

取决于数组中第一个非 null

取决于数组中第一个非 null

通过 日期检测string

日期

日期

通过 数值检测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"]

例如

resp = client.index(
    index="my-index-000001",
    id="1",
    document={
        "create_date": "2015/09/02"
    },
)
print(resp)

resp1 = client.indices.get_mapping(
    index="my-index-000001",
)
print(resp1)
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
const response = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    create_date: "2015/09/02",
  },
});
console.log(response);

const response1 = await client.indices.getMapping({
  index: "my-index-000001",
});
console.log(response1);
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 来禁用动态日期检测

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "date_detection": False
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "create_date": "2015/09/02"
    },
)
print(resp1)
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
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    date_detection: false,
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    create_date: "2015/09/02",
  },
});
console.log(response1);
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 以支持您自己的 日期格式

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "dynamic_date_formats": [
            "MM/dd/yyyy"
        ]
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "create_date": "09/25/2015"
    },
)
print(resp1)
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
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    dynamic_date_formats: ["MM/dd/yyyy"],
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    create_date: "09/25/2015",
  },
});
console.log(response1);
PUT my-index-000001
{
  "mappings": {
    "dynamic_date_formats": ["MM/dd/yyyy"]
  }
}

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

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

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "dynamic_date_formats": [
            "yyyy/MM",
            "MM/dd/yyyy"
        ]
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "create_date": "09/25/2015"
    },
)
print(resp1)
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
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    dynamic_date_formats: ["yyyy/MM", "MM/dd/yyyy"],
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    create_date: "09/25/2015",
  },
});
console.log(response1);
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"
        }
      }
    }
  }
}

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

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "dynamic_date_formats": [
            "yyyy/MM||MM/dd/yyyy"
        ]
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "create_date": "09/25/2015"
    },
)
print(resp1)
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
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    dynamic_date_formats: ["yyyy/MM||MM/dd/yyyy"],
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    create_date: "09/25/2015",
  },
});
console.log(response1);
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 支持原生浮点数和整数数据类型,但某些应用程序或语言有时可能会将数字呈现为字符串。通常,正确的解决方案是显式映射这些字段,但可以启用数值检测(默认情况下禁用)来自动执行此操作

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "numeric_detection": True
    },
)
print(resp)

resp1 = client.index(
    index="my-index-000001",
    id="1",
    document={
        "my_float": "1.0",
        "my_integer": "1"
    },
)
print(resp1)
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
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    numeric_detection: true,
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index-000001",
  id: 1,
  document: {
    my_float: "1.0",
    my_integer: "1",
  },
});
console.log(response1);
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 字段添加。