映射和字段类型

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

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

例如,使用显式映射,您可以确保 year 被当作文本处理,而 age 被当作整数,而不是让动态映射将两者都解释为整数。

动态映射

当您索引文档时,UDB-SX 会通过动态映射自动添加字段。您也可以显式地向索引映射添加字段。

动态映射类型

类型 描述
null null 字段无法被索引或搜索。当字段设置为 null 时,UDB-SX 的行为就像该字段没有值。
boolean UDB-SX 接受 truefalse 作为布尔值。空字符串等同于 false
float 单精度 32 位 IEEE 754 浮点数,仅限于有限值。
double 双精度 64 位 IEEE 754 浮点数,仅限于有限值。
integer 有符号 32 位整数。
object 对象是标准的 JSON 对象,可以拥有自己的字段和映射。例如,一个 movies 对象可以具有 titleyeardirector 等额外属性。
array UDB-SX 没有特定的数组数据类型。数组被表示为与字段关联的相同数据类型(例如整数或字符串)的一组值。在索引时,您可以为字段传递多个值,UDB-SX 会将其视为数组。空数组是有效的,并被识别为零元素的数组字段——而不是没有值的字段。UDB-SX 支持查询和过滤数组,包括检查值、范围查询以及连接和交集等数组操作。嵌套数组(可能包含复杂对象或其他数组)也可用于高级数据建模。
text 表示完整文本值的字符串字符序列。
keyword 结构化字符的字符串序列,例如电子邮件地址或邮政编码。
日期检测字符串 默认启用。如果新的字符串字段匹配日期格式,则该字符串将被处理为 date 字段。例如,date: "2012/03/11" 被处理为日期。
数字检测字符串 如果禁用,UDB-SX 可能会自动将数值作为字符串处理,而它们本应作为数字处理。启用后,UDB-SX 可以将字符串处理为 longintegershortbytedoublefloathalf_floatscaled_floatunsigned_long。默认是禁用。

动态模板

动态模板用于根据数据类型、字段名或字段路径为动态添加的字段定义自定义映射。它们允许您为数据定义灵活的模式,能够自动适应输入数据结构或格式的变化。

您可以使用以下语法定义动态映射模板:

PUT index
{
  "mappings": {
    "dynamic_templates": [
        {
          "fields": {
            "mapping": {
              "type": "short"
            },
            "match_mapping_type": "string",
            "path_match": "status*"
          }
        }
    ]
  }
}

此映射配置会动态地将任何名称以 status 开头的字段(例如 status_code)映射到 short 数据类型,前提是索引期间提供的初始值是字符串。

动态映射参数

dynamic_templates 支持以下参数用于匹配条件和映射规则。默认值为 null

参数 描述
match_mapping_type 指定触发映射的 JSON 数据类型(例如 string、long、double、object、binary、boolean、date)。
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"
}

要向现有索引或数据流添加映射,您可以向 _mapping 端点发送 PUTPOST HTTP 方法的请求,如下面的示例请求所示:

POST sample-index1/_mapping
{
  "properties": {
    "year":    { "type" : "text" },
    "age":     { "type" : "integer" },
    "director":{ "type" : "text" }
  }
}

您无法更改现有字段的映射,只能修改字段的映射参数。

映射参数

映射参数用于配置索引字段的行为。更多信息,请参阅 映射和字段类型

映射限制设置

UDB-SX 有一些映射限制和设置,例如下表中列出的设置。可以根据您的需求配置这些设置。

设置 默认值 允许值 类型 描述
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 地址的示例,请参阅 映射用例