Mapping定义了一个索引的doc中包含哪些fields,这些fields如何被存储/索引。
Field数据类型包括:
简单类型:text, keyword, date, long, double, boolean, ip
嵌套类型:object, nested
特殊类型:geo_point, geo_shape, completion
可以通过multi-fields特性为同一个field提供不同类型的存储
由于dynamic mappings特性,一个索引的mapping会变得越来越大。为了防止mapping爆炸,可以设置限制参数:
index.mapping.total_fields.limit index可以包含的最多fields数。默认1000
index.mapping.depth.limit field的最大深度。默认20
index.mapping.nested_fields.limit nested fields的最大数目。默认50
索引的mappings在创建后不允许修改,需要通过reindex来修改一个mappings。
13.1 Field Datatypes
Text
会被analyzer分词解析
Keyword
不被分词处理,用于filter/sort/aggregation场景
Numeric
long/integer/short/byte/double/float/halt_float/scaled_float
Date
JSON没有一种日期类型,因此ES中的日期格式可能为:
代表时间的字符串,如“2016-01-01”, "2016/01/01 00:00:00"
long值,代表milliseconds-since-the-epoch
int值,代表seconds-since-the-epoch
内部存储时会被转为UTC时间,并存储成long值代表milliseconds-since-the-epoch
Boolean
false/"false"/true/"true"
Binary
Base64编码形式存储的值
Range
integer_range/float_range/long_range/double_range/date_range/ip_range
Array
ES中没有专门的array类型,所有field默认都可以包含0个或多个值
string array: ["one", "two"]
int array: [1, 2]
数组中的元素必须有相同的类型
Object
可以定义嵌套的field结构:
PUT my_index { "mappings": { "_doc": { "properties": { "region": { "type": "keyword" }, "manager": { "properties": { "age": { "type": "integer" }, "name": { "properties": { "first": { "type": "text" }, "last": { "type": "text" } } } } } } } } }
Nested
需要独立检索数组内的元素时,使用nested替代object
13.2 Meta-Fields
每个doc上都会包含一些元信息,可以分为以下几类:
Identity meta-fields
_index doc所属的索引
_uid _type和_id的组合
_type 文档的mapping type
_id 文档id
Document source meta-fields
_source 文档原文
_size _source大小,单位bytes
Indexing meta-fields
_all 包含了所有fields,默认关闭
_field_names 非空fields的名字集合
Routing meta-field
_routing 自定义分片路由字段
13.3 Mapping parameters
在定义mapping时,可以添加以下参数
fields
将一个field以不同方式存储
{ "mappings": { "_doc": { "properties": { "city": { "type": "text", // city是text "fields": { "raw": { "type": "keyword" // city.raw是keyword } } } } } } }
properties
用于为object/nested类型定义内嵌数据类型
doc_values
es会以列存的方式保存fields,用于sort/aggregation/script访问等场景。默认除了text类型的所有fields都已经开启了doc_values,可以将它设置为false关闭。
copy_to
自定义类似_all的field,将fields拷贝到一个特殊field中,对该field检索就可以实现跨多个field的效果。
analyzer/search_analyzer
为text类型设置分词器。
normalizer
预处理keyword类型的field值及查询值
store
默认情况下,field会被索引但不会被单独存储。所有fields的内容会集中保存在_source总,可以通过source filtering返回部分source信息。
但有些情况下,我们可能需要单独存储某些fields。这时就可以将这些field的store设置为true,在查询中通过stored_fields来获取。
index
是否索引一个field,默认为true。
enabled
作用于object类型的fields,让es不解析相关field的内容。
null_value
将null替代为指定值。
format
es为date类型的数据内置了大量的formats,也可以通过format字段为date field指定特殊的格式。
ignore_above
忽略长度超过ingore_above的string。
ignore_malformed
一个doc的field如果不满足定义,默认情况下会抛出异常,从而会忽略整个doc。可以将ignore_malformed为true,可以忽略不正确的fields,保留正常的doc。
dynamic
默认情况下,可以动态添加fields到mapping中。可以将dynamic设置为false,禁止dynamic mapping。