概要
在 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 索引中关于此字段的定义:
Fields 的作用
在 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 作为范围较小的数据类型, 字段的长度也相对较短,使用它可以提高索引和搜索的效率。