支持的字段类型
在创建映射时,可以为字段指定数据类型。以下部分根据用途或数据结构对支持的字段类型进行了分组。
通用字段类型
字段类型 | 描述 |
alias | 现有字段的别名。 |
布尔值 | 一个布尔值(true/false)。 |
binary | Base64 编码的二进制值。 |
percolator | 作为存储查询的字段。 |
derived | 通过脚本从其他字段计算得出的动态生成字段。 |
字符串字段类型
字段类型 | 描述 |
keyword | 未分析的字符串,适用于精确匹配。 |
text | 已分析的全文字符串。 |
match_only_text | text 的轻量级版本,仅用于搜索用例。 |
token_count | 存储分析后的词元数量。 |
wildcard | 启用高效的子字符串和正则表达式匹配。 |
数值字段类型
字段类型 | 描述 |
byte 、double 、float 、half_float 、integer 、long 、short | 存储各种精度的整数或浮点数。 |
unsigned_long | 一个 64 位无符号整数。 |
scaled_float | 按固定因子缩放以进行存储的浮点数。 |
日期和时间字段类型
字段类型 | 描述 |
date | 以毫秒为单位存储的日期或时间戳。 |
date_nanos | 以纳秒为单位存储的日期或时间戳。 |
IP 字段类型
字段类型 | 描述 |
ip | 存储 IPv4 或 IPv6 地址。 |
范围字段类型
字段类型 | 描述 |
integer_range 、long_range 、double_range 、float_range 、ip_range 、date_range | 定义数值、日期或 IP 值的范围。 |
对象字段类型
字段类型 | 描述 |
object | 一个 JSON 对象。 |
nested | JSON 对象的数组,索引为单独的文档。 |
flat_object | 作为字符串平面映射处理的 JSON 对象。 |
join | 定义文档之间的父/子关系。 |
专业搜索字段类型
字段类型 | 描述 |
completion | 使用建议器支持自动完成功能。 |
search_as_you_type | 启用前缀和中缀的“边输入边搜索”查询。 |
rank_feature 、rank_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
的影响。