Link Search Menu Expand Document Documentation Menu

映射与字段类型

映射告诉 OpenSearch 如何存储和索引您的文档及其字段。您可以为每个字段指定数据类型(例如,将 year 作为 date),以提高存储和查询效率。

虽然动态映射会自动添加新数据和字段,但建议使用显式映射。显式映射允许您预先定义精确的结构和数据类型。这有助于保持数据一致性并优化性能,特别是对于大型数据集或高吞吐量索引操作。

例如,使用显式映射,您可以确保 year 被视为文本而 age 被视为整数,而不是像动态映射那样两者都被解释为整数。

动态映射

当您索引文档时,OpenSearch 会通过动态映射自动添加字段。您也可以显式地将字段添加到索引映射中。

动态映射类型

类型 描述
null 空字段无法被索引或搜索。当字段设置为 null 时,OpenSearch 的行为就像该字段没有值一样。
布尔值 OpenSearch 接受 truefalse 作为布尔值。空字符串等同于 false.
浮点型 一个单精度、32位 IEEE 754 浮点数,限制为有限值。
双精度浮点型 一个双精度、64位 IEEE 754 浮点数,限制为有限值。
整型 一个有符号的 32 位数字。
对象 对象是标准的 JSON 对象,它们可以有自己的字段和映射。例如,一个 movies 对象可以有 titleyeardirector 等附加属性。
数组 OpenSearch 没有特定的数组数据类型。数组表示为与字段关联的相同数据类型(例如,整数或字符串)的一组值。索引时,您可以为一个字段传递多个值,OpenSearch 会将其视为一个数组。空数组是有效的,并被识别为具有零元素的数组字段,而不是没有值的字段。OpenSearch 支持查询和筛选数组,包括值检查、范围查询以及连接和交集等数组操作。可能包含复杂对象或其他数组的嵌套数组也可以用于高级数据建模。
文本 表示全文值的字符字符串序列。
关键词 结构化字符的字符串序列,例如电子邮件地址或邮政编码。
日期检测字符串 默认启用,如果新字符串字段与日期的格式匹配,则该字符串将被处理为 date 字段。例如,date: "2012/03/11" 被处理为日期。
数值检测字符串 如果禁用,OpenSearch 可能会在数值应该被处理为数字时自动将其处理为字符串。启用后,OpenSearch 可以将字符串处理为 longintegershortbytedoublefloathalf_floatscaled_floatunsigned_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 数据类型(例如,stringlongdoubleobjectbinaryBooleandate)。
match 用于匹配字段名并应用映射的正则表达式。
unmatch 用于从映射中排除字段名的正则表达式。
match_pattern 确定模式匹配行为,可以是 regexsimple。默认值为 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"
}

要将映射添加到现有索引或数据流,您可以使用 PUTPOST 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-index1yearage 字段的映射

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 地址的示例,请参阅映射用例

剩余 350 字符

有问题?

想贡献?