在 es 中,一个字段可能运用于不同的场景,但是某个字段类型的使用场景是有局限的
下面,我们先来看一段 es 查询语句:
$must = [
"bool" => [
"should" => [
[
"range" => [
"user_id.raw" => [
"gt" => 0
]
]
],
[
"bool" => [
"filter" => [
[
"term" => [
'user_id' => 0
]
],
...
]
]
],
],
"minimum_should_match" => 1
]
];
由上面的 es 查询语句可以看到,user_id 用于不同的过滤规则,我们看下 es 索引中关于此字段的定义:
![](https://img-blog.csdnimg.cn/img_convert/e40a1f3b6ee8ba12a90837c552c759fc.jpeg)
在 es 中,一个字段可能运用于不同的场景,但是某个字段类型的使用场景是有局限的。这就是 mapping 参数 - fields 的设计用途所在。
fields:多字段特性 让一个字段拥有多个子字段类型,使得一个字段能够被多个不同的索引方式进行索引。
例一:
PUT index_name
{
"mappings": { # 设置 mappings
"properties": { # 属性,固定写法
"city": { # 字段名
"type": "text", # city 字段的类型为 text
"fields": { # 多字段域,固定写法
"raw": { # 子字段名称
"type": "keyword" # 子字段类型
}
}
}
}
}
}
说明:fields 可以让同一文本有多种不同的索引方式,比如上面所示一个 String 类型的字段 city,可以使用 text 类型做全文检索,使用 keyword 类型做聚合和排序。
例二:
PUT index_name
{
"mappings": {
"properties": {
"title": { # 字段名称
"type": "text", # 字段类型
"analyzer": "english", # 字段分词器
"fields": { # 多字段域,固定写法
"std": { # 子字段名称
"type": "text", # 子字段类型
"analyzer": "standard" # 子字段分词器
}
}
}
}
}
}
例三:
PUT index_name
{
"mappings": { # 设置 mappings
"properties": { # 属性,固定写法
"user_id": { # 字段名
"type": "keyword", # user_id 字段的类型为 keyword
"fields": { # 多字段域,固定写法
"raw": { # 子字段名称
"type": "integer" # 子字段类型
}
}
}
}
}
}
说明:fields 可以让同一文本有多种不同的索引方式,比如上面所示一个 String 类型的字段 user_id,可以使用 keyword 类型做聚合和排序,使用 integer 来做范围查询,又由于 integer 作为范围较小的数据类型, 字段的长度也相对较短,使用它可以提高索引和搜索的效率。