目录
- 背景
- 第一部分 版本升级指引
- 第二部分 升级方法和具体步骤
- 总结
- 参考文献及资料
背景
第一部分 Mapping
Mapping在Elasticsearch中作用类似于传统数据库中的表结构定义(schema),即Index的元数据信息。主要作用有:
- 定义索引(Index)中字段名称;
- 定义字段的数据类型;
- 定义倒排索引的配置;
在Elasticsearch 7.x
版本前,单个index中支持多个type。每个index都会对应有自己的mapping。这时候index可以类比关系型数据库中库,而不同type类比库中表。
在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:
- index.mapping.total_fields.limit:一个索引中能定义的字段的最大数量,默认是 1000
- index.mapping.depth.limit:字段的最大深度,以内部对象的数量来计算,默认是20
- index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认是50
1.1 Elasticsearch中数据类型
1.1.1 基本类型
text类型
该类型的字段将经过分词器分词,用于全文检索;
keyword类型
不经过分词器,用于精确检索(只能检索该字段的完整值),用于过滤(filtering)
数值类型
和编程语言相同,主要有:
long:有符号64-bit integer:-2^63 ~ 2^63 - 1
integer:有符号32-bit integer,-2^31 ~ 2^31 - 1
short:有符号16-bit integer,-32768 ~ 32767
byte: 有符号8-bit integer,-128 ~ 127
double:64-bit IEEE 754 浮点数
float:32-bit IEEE 754 浮点数
half_float:16-bit IEEE 754 浮点数
scaled_float
布尔类型
逻辑型,即true/false
日期类型
由于Json没有date类型,所以es通过识别字符串是否符合format定义的格式来判断是否为date类型。ormat默认为:
strict_date_optional_time||epoch_millis
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html
二进制类型
该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
范围类型
范围类型表示值是一个范围,而不是一个具体的值
譬如 age 的类型是 integer_range,那么值可以是 {“gte” : 10, “lte” : 20};搜索 “term” : {“age”: 15} 可以搜索该值;搜索 “range”: {“age”: {“gte”:11, “lte”: 15}} 也可以搜索到
range参数 relation 设置匹配模式
- INTERSECTS :默认的匹配模式,只要搜索值与字段值有交集即可匹配到
- WITHIN:字段值需要完全包含在搜索值之内,也就是字段值是搜索值的子集才能匹配
- CONTAINS:与WITHIN相反,只搜索字段值包含搜索值的文档
integer_range
float_range
long_range
double_range
date_range:64-bit 无符号整数,时间戳(单位:毫秒)
ip_range:IPV4 或 IPV6 格式的字符串
1.1.2 复杂类型
数组类型
字符串数组 [ “one”, “two” ]
整数数组 [ 1, 2 ]
数组的数组 [ 1, [ 2, 3 ]],相当于 [ 1, 2, 3 ]
Object对象数组 [ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }]
同一个数组只能存同类型的数据,不能混存,譬如 [ 10, “some string” ] 是错误的
数组中的 null 值将被 null_value 属性设置的值代替或者被忽略
空数组 [] 被当做 missing field 处理
对象类型
对象类型可能有内部对象
被索引的形式为:manager.name.first
嵌套类型
地理位置数据类型
专用数据类型
- 记录IP地址 ip
- 实现自动补全 completion
- 记录分词数 token_count
- 记录字符串hash值 murmur3
- Percolator
1.2 多字段特性(multi-fields)
- 允许对同一个字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索,只需要在人名中新增一个子字段为 pinyin 即可
- 通过参数 fields 设置
1.3 不可修改性
Mapping中的字段类型一旦设定后,禁止直接修改,原因是Lucence实现的倒排索引生成后不允许修改,除非重新建立新的索引,然后做reindex操作。但是允许新增字段。通过dynamic参数来控制字段的新增:
- true(默认)允许自动新增字段
- false不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
- strict 文档不能写入,报错
第二部分 设置Mapping
在创建一个索引的时候,可以对 dynamic
进行设置,可以设成 false
、true
或者 strict
。
第三部分 Dynamic Mapping
Dynamic Mapping 机制使我们不需要手动定义 Mapping,ES 会自动根据文档信息来判断字段合适的类型,但是有时候也会推算的不对,比如地理位置信息有可能会判断为 Text
,当类型如果设置不对时,会导致一些功能无法正常工作,比如 Range 查询。
3.1 类型自动推断
3.2 更新mapping
如果是新增加的字段,根据 Dynamic 的设置分为以下三种状况:
- 当 Dynamic 设置为
true
时,一旦有新增字段的文档写入,Mapping 也同时被更新。 - 当 Dynamic 设置为
false
时,索引的 Mapping 是不会被更新的,新增字段的数据无法被索引,也就是无法被搜索,但是信息会出现在_source
中。 - 当 Dynamic 设置为
strict
时,文档写入会失败。
另外一种是字段已经存在,这种情况下,ES 是不允许修改字段的类型的,因为 ES 是根据 Lucene 实现的倒排索引,一旦生成后就不允许修改,如果希望改变字段类型,必须使用 Reindex API 重建索引。
不能修改的原因是如果修改了字段的数据类型,会导致已被索引的无法被搜索,但是如果是增加新的字段,就不会有这样的影响。
- 动态映射(dynamic:true):动态添加新的字段(或缺省)。
- 静态映射(dynamic:false):忽略新的字段。在原有的映射基础上,当有新的字段时,不会主动的添加新的映射关系,只作为查询结果出现在查询中。
- 严格模式(dynamic: strict):如果遇到新的字段,就抛出异常。
第四部分 Index Template
###
参考材料
1、Elasticsearch官网 链接:https://www.elastic.co/cn/