映射与字段类型
映射告诉 OpenSearch 如何存储和索引您的文档及其字段。您可以为每个字段指定数据类型(例如,将 year
作为 date
),以提高存储和查询效率。
虽然动态映射会自动添加新数据和字段,但建议使用显式映射。显式映射允许您预先定义精确的结构和数据类型。这有助于保持数据一致性并优化性能,特别是对于大型数据集或高吞吐量索引操作。
例如,使用显式映射,您可以确保 year
被视为文本而 age
被视为整数,而不是像动态映射那样两者都被解释为整数。
动态映射
当您索引文档时,OpenSearch 会通过动态映射自动添加字段。您也可以显式地将字段添加到索引映射中。
动态映射类型
类型 | 描述 |
---|---|
null | 空字段无法被索引或搜索。当字段设置为 null 时,OpenSearch 的行为就像该字段没有值一样。 |
布尔值 | OpenSearch 接受 true 和 false 作为布尔值。空字符串等同于 false. |
浮点型 | 一个单精度、32位 IEEE 754 浮点数,限制为有限值。 |
双精度浮点型 | 一个双精度、64位 IEEE 754 浮点数,限制为有限值。 |
整型 | 一个有符号的 32 位数字。 |
对象 | 对象是标准的 JSON 对象,它们可以有自己的字段和映射。例如,一个 movies 对象可以有 title 、year 和 director 等附加属性。 |
数组 | OpenSearch 没有特定的数组数据类型。数组表示为与字段关联的相同数据类型(例如,整数或字符串)的一组值。索引时,您可以为一个字段传递多个值,OpenSearch 会将其视为一个数组。空数组是有效的,并被识别为具有零元素的数组字段,而不是没有值的字段。OpenSearch 支持查询和筛选数组,包括值检查、范围查询以及连接和交集等数组操作。可能包含复杂对象或其他数组的嵌套数组也可以用于高级数据建模。 |
文本 | 表示全文值的字符字符串序列。 |
关键词 | 结构化字符的字符串序列,例如电子邮件地址或邮政编码。 |
日期检测字符串 | 默认启用,如果新字符串字段与日期的格式匹配,则该字符串将被处理为 date 字段。例如,date: "2012/03/11" 被处理为日期。 |
数值检测字符串 | 如果禁用,OpenSearch 可能会在数值应该被处理为数字时自动将其处理为字符串。启用后,OpenSearch 可以将字符串处理为 long 、integer 、short 、byte 、double 、float 、half_float 、scaled_float 和 unsigned_long 类型。默认禁用。 |
动态模板
动态模板用于根据数据类型、字段名或字段路径为动态添加的字段定义自定义映射。它们允许您为数据定义灵活的模式,该模式可以自动适应输入数据的结构或格式变化。
您可以使用以下语法定义动态映射模板
PUT index
{
"mappings": {
"dynamic_templates": [
{
"fields": {
"mapping": {
"type": "short"
},
"match_mapping_type": "string",
"path_match": "status*"
}
}
]
}
}
此映射配置会将任何以 status
开头(例如,status_code
)的字段动态映射为 short
数据类型,前提是索引期间提供的初始值为字符串。
动态映射参数
动态模板支持以下用于匹配条件和映射规则的参数。默认值为 null
。
参数 | 描述 |
---|---|
match_mapping_type | 指定触发映射的 JSON 数据类型(例如,string 、long 、double 、object 、binary 、Boolean 、date )。 |
match | 用于匹配字段名并应用映射的正则表达式。 |
unmatch | 用于从映射中排除字段名的正则表达式。 |
match_pattern | 确定模式匹配行为,可以是 regex 或 simple 。默认值为 simple 。 |
path_match | 允许您使用正则表达式匹配嵌套字段路径。 |
path_unmatch | 使用正则表达式从映射中排除嵌套字段路径。 |
mapping | 要应用的映射配置。 |
显式映射
如果您确切知道需要使用的字段数据类型,则可以在创建索引时在请求体中指定它们,如下面示例请求所示
PUT sample-index1
{
"mappings": {
"properties": {
"year": { "type" : "text" },
"age": { "type" : "integer" },
"director":{ "type" : "text" }
}
}
}
响应
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "sample-index1"
}
要将映射添加到现有索引或数据流,您可以使用 PUT
或 POST
HTTP 方法向 _mapping
端点发送请求,如下面示例请求所示
POST sample-index1/_mapping
{
"properties": {
"year": { "type" : "text" },
"age": { "type" : "integer" },
"director":{ "type" : "text" }
}
}
您不能更改现有字段的映射,只能修改该字段的映射参数。
映射参数
映射参数用于配置索引字段的行为。有关更多信息,请参阅映射与字段类型。
映射限制设置
OpenSearch 具有某些映射限制和设置,例如下表中列出的设置。可以根据您的要求配置设置。
设置 | 默认值 | 允许值 | 类型 | 描述 |
---|---|---|---|---|
index.mapping.nested_fields.limit | 50 | [0,) | 动态 | 限制在索引映射中可定义的嵌套字段的最大数量。 |
index.mapping.nested_objects.limit | 10,000 | [0,) | 动态 | 限制在单个文档中可创建的嵌套对象的最大数量。 |
index.mapping.total_fields.limit | 1,000 | [0,) | 动态 | 限制在索引映射中可定义的字段的最大数量。 |
index.mapping.depth.limit | 20 | [1,100] | 动态 | 限制在索引映射中可定义的嵌套对象和嵌套字段的最大深度。 |
index.mapping.field_name_length.limit | 50,000 | [1,50000] | 动态 | 限制在索引映射中可定义的字段名的最大长度。 |
index.mapper.dynamic | true | {true,false} | 动态 | 确定是否应将新字段动态添加到映射中。 |
获取映射
要获取一个或多个索引的所有映射,请使用以下请求
GET <index>/_mapping
在上述请求中,<index>
可以是索引名或以逗号分隔的索引名列表。
要获取所有索引的所有映射,请使用以下请求
GET _mapping
要获取特定字段的映射,请提供索引名和字段名
GET _mapping/field/<fields>
GET /<index>/_mapping/field/<fields>
<index>
和 <fields>
都可以指定为一个值或以逗号分隔的列表。例如,以下请求检索 sample-index1
中 year
和 age
字段的映射
GET sample-index1/_mapping/field/year,age
响应包含指定的字段
{
"sample-index1" : {
"mappings" : {
"year" : {
"full_name" : "year",
"mapping" : {
"year" : {
"type" : "text"
}
}
},
"age" : {
"full_name" : "age",
"mapping" : {
"age" : {
"type" : "integer"
}
}
}
}
}
}
映射用例
有关用例示例,包括映射字符串字段和忽略格式错误的 IP 地址的示例,请参阅映射用例。