Link Search Menu Expand Document Documentation Menu

支持的字段类型

在创建映射时,可以为字段指定数据类型。以下部分根据用途或数据结构对支持的字段类型进行了分组。

通用字段类型

字段类型 描述
alias 现有字段的别名。
布尔值 一个布尔值(true/false)。
binary Base64 编码的二进制值。
percolator 作为存储查询的字段。
derived 通过脚本从其他字段计算得出的动态生成字段。

字符串字段类型

字段类型 描述
keyword 未分析的字符串,适用于精确匹配。
text 已分析的全文字符串。
match_only_text text 的轻量级版本,仅用于搜索用例。
token_count 存储分析后的词元数量。
wildcard 启用高效的子字符串和正则表达式匹配。

数值字段类型

字段类型 描述
bytedoublefloathalf_floatintegerlongshort 存储各种精度的整数或浮点数。
unsigned_long 一个 64 位无符号整数。
scaled_float 按固定因子缩放以进行存储的浮点数。

日期和时间字段类型

字段类型 描述
date 以毫秒为单位存储的日期或时间戳。
date_nanos 以纳秒为单位存储的日期或时间戳。

IP 字段类型

字段类型 描述
ip 存储 IPv4 或 IPv6 地址。

范围字段类型

字段类型 描述
integer_rangelong_rangedouble_rangefloat_rangeip_rangedate_range 定义数值、日期或 IP 值的范围。

对象字段类型

字段类型 描述
object 一个 JSON 对象。
nested JSON 对象的数组,索引为单独的文档。
flat_object 作为字符串平面映射处理的 JSON 对象。
join 定义文档之间的父/子关系。

专业搜索字段类型

字段类型 描述
completion 使用建议器支持自动完成功能。
search_as_you_type 启用前缀和中缀的“边输入边搜索”查询。
rank_featurerank_features 提高或降低文档相关性分数。
knn_vector 为 k-NN 搜索索引向量。
semantic 封装文本或二进制字段以简化语义搜索设置。
star_tree 使用 star-tree 索引预计算聚合以加快性能。

数组

OpenSearch 中没有专门的数组字段类型。相反,您可以将值数组传递给任何字段。数组中的所有值必须具有相同的字段类型。

PUT testindex1/_doc/1
{
  "number": 1 
}

PUT testindex1/_doc/2
{
  "number": [1, 2, 3] 
}

多字段

多字段用于以不同方式索引同一字段。字符串通常被映射为 text 用于全文查询,映射为 keyword 用于精确值查询。

可以使用 fields 参数创建多字段。例如,您可以将书籍 title 映射为 text 类型,并保留一个 title.raw 子字段为 keyword 类型。

PUT books
{
  "mappings" : {
    "properties" : {
      "title" : {
        "type" : "text",
        "fields" : {
          "raw" : {
            "type" : "keyword"
          }
        }
      }
    }
  }
}

空值

将字段值设置为 null、空数组或包含 null 值的数组,会使该字段等同于空字段。因此,您无法搜索该字段中包含 null 的文档。

要使字段可搜索 null 值,您可以在索引的映射中指定其 null_value 参数。然后,传递给此字段的所有 null 值都将替换为指定的 null_value

null_value 参数必须与字段的类型相同。例如,如果您的字段是字符串类型,则此字段的 null_value 也必须是字符串。

示例

创建映射以将 emergency_phone 字段中的 null 值替换为字符串“NONE”

PUT testindex
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "emergency_phone": {
        "type": "keyword",
        "null_value": "NONE" 
      }
    }
  }
}

将三个文档索引到 testindex 中。文档 1 和 3 的 emergency_phone 字段包含 null,而文档 2 的 emergency_phone 字段为空数组。

PUT testindex/_doc/1
{
  "name": "Akua Mansa",
  "emergency_phone": null
}
PUT testindex/_doc/2
{
  "name": "Diego Ramirez",
  "emergency_phone" : []
}
PUT testindex/_doc/3 
{
  "name": "Jane Doe",
  "emergency_phone": [null, null]
}

搜索没有紧急电话的人

GET testindex/_search
{
  "query": {
    "term": {
      "emergency_phone": "NONE"
    }
  }
}

响应包含文档 1 和 3,但不包含文档 2,因为只有显式的 null 值才会被替换为字符串“NONE”

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.18232156,
    "hits" : [
      {
        "_index" : "testindex",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.18232156,
        "_source" : {
          "name" : "Akua Mansa",
          "emergency_phone" : null
        }
      },
      {
        "_index" : "testindex",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.18232156,
        "_source" : {
          "name" : "Jane Doe",
          "emergency_phone" : [
            null,
            null
          ]
        }
      }
    ]
  }
}

_source 字段仍然包含显式的 null 值,因为它不受 null_value 的影响。