动态字段映射
编辑动态字段映射
编辑当 Elasticsearch 在文档中检测到新字段时,默认情况下会动态地将该字段添加到类型映射中。 dynamic
参数控制此行为。
您可以显式地指示 Elasticsearch 基于传入的文档动态创建字段,方法是将 dynamic
参数设置为 true
或 runtime
。当启用动态字段映射时,Elasticsearch 使用下表中的规则来确定每个字段的数据类型映射方式。
下表中的字段数据类型是 Elasticsearch 动态检测的唯一 字段数据类型。您必须显式映射所有其他数据类型。
Elasticsearch 数据类型 |
||
JSON 数据类型 |
|
|
|
不添加字段 |
不添加字段 |
|
|
|
|
|
|
|
|
|
|
|
不添加字段 |
|
取决于数组中第一个非 |
取决于数组中第一个非 |
通过 日期检测 的 |
|
|
通过 数值检测 的 |
|
|
不通过 |
带有 |
|
您可以禁用动态映射,包括在文档级别和 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);
禁用日期检测
编辑可以通过将 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" }
|
自定义检测到的日期格式
编辑或者,可以自定义 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_millis
和 epoch_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);