动态字段映射
编辑动态字段映射编辑
默认情况下,当 Elasticsearch 在文档中检测到新字段时,它会_动态地_将该字段添加到类型映射中。 dynamic
参数控制此行为。
您可以通过将 dynamic
参数设置为 true
或 runtime
,明确指示 Elasticsearch 根据传入的文档动态创建字段。启用动态字段映射后,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"
]
例如
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
禁用日期检测编辑
可以通过将 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" }
|
自定义检测到的日期格式编辑
或者,可以自定义 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_millis
和 epoch_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