ES 10 - Elasticsearch的索引别名和索引模板
目录
1 索引模板概述
1.1 什么是索引模板
索引模板: 就是把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板, 在创建新索引时, 指定要使用的模板名, 就可以直接重用已经定义好的模板中的设置和映射.
1.2 索引模板中的内容
(1) settings: 指定index的配置信息, 比如分片数、副本数, tranlog同步条件、refresh策略等信息;
(2) mappings: 指定index的内部构建信息, 主要有:
①
_all
: all field字段, 如果开启,_all
字段就会把所有字段的内容都包含进来,检索的时候可以不用指定字段查询 —— 会检索多个字段, 设置方式:"_all": {"enabled": true}
;
②_source
: source field字段, elasticsearch中为每个文档都保存一份源数据, 如果不开启, 也就是"_source": {"enabled": false}
, 查询的时候就只会返回文档的id, 其他的文档内容需要通过fields字段到索引中再次获取数据, 效率很低. 但若开启, 索引数据的体积会更大, 此时就可以通过compress进行压缩, 并通过inclueds
、excludes
等方式在field上进行限制 —— 指定义允许哪些字段存储到_source
中, 哪些不存储;
③properties
: 最重要的配置, 是对索引结构和文档字段的设置.
1.3 索引模板的用途
索引模板一般用在时间序列相关的索引中.
—— 也就是说, 如果你需要每间隔一定的时间就建立一次索引, 你只需要配置好索引模板, 以后就可以直接使用这个模板中的设置, 不用每次都设置settings和mappings.
索引模板一般与索引别名一起使用.
2 创建索引模板
创建示例: 创建一个商品的索引模板:
put _template/shop_template { "template": "shop*", // 可以通过"shop*"来适配 "order": 0, // 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高 "settings": { "number_of_shards": 1 // 分片数量, 可以定义其他配置项 }, "aliases": { "alias_1": {} // 索引对应的别名 }, "mapping": { "_default": { // 默认的配置 "_source": { "enabled": false }, // 是否保存字段的原始值 "_all": { "enabled": false }, // 禁用_all字段 "dynamic": "strict" // 只用定义的字段, 关闭默认的自动类型推断 }, "type1": { // 默认的文档类型设置为type1 "_source": {"enabled": false}, "properties": { // 字段的映射 "@timestamp": { // 具体的字段映射 "type": "date", "format": "strict_date_optional_time||epoch_millis" }, "@version": { "doc_values": true, "index": "not_analyzed", "type": "string" }, "loglevel": { "type": "long" } } } } }
说明:
直接修改mapping的优先级 > 索引模板中的设置;
索引匹配了多个template, 当属性等配置出现不一致时, 以模板的权重(order属性的值)为准, 值越大越优先, order的默认值是0.
3 查看索引模板
(1) 查看示例:
get _template // 查看所有模板 get _template/temp* // 查看与通配符相匹配的模板 get _template/temp1,temp2 // 查看多个模板 get _template/shop_template // 查看指定模板
(2) 判断模板是否存在:
判断示例:
head _template/shop_tem
结果说明:
a) 如果存在, 响应结果是:
200 - ok
b) 如果不存在, 响应结果是:
404 - not found
4 删除索引模板
删除示例:
delete _template/shop_template // 删除上述创建的模板
如果模板不存在, 响应结果将是空集{}
.
5 模板的使用建议
5.1 一个index中不能有多个type
—— elasticsearch 6.x版本中已经不支持在同一个index下创建多个type.
6.x之前的版本中, 父子文档的实现是一个索引中定义多个type, 6.x中实现方式改变为join方式.
如果在同一个index下创建多个type, 会报出如下错误信息:
{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]" } ], "type": "illegal_argument_exception", "reason": "rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]" }, "status": 400 }
错误信息指出: 拒绝对[book_shop]的mapping信息进行修改, 因为它作为final mapping(最终态的mapping), 将会有超过2个type.
5.2 设置_source = false
如果你只关心度量结果, 而不是原始文档的内容, 就设置"_source": {"enabled": false}
.
—— 这能节省磁盘空间并减少磁盘io上的开销.
你可以把原始的数据存储在mysql、hbase等数据库, 从es中得到文档的id之后, 再到相应的数据库中获取数据.
5.3 设置_all = false
如果你确切地知道你要对哪个field做查询操作, 就设置"_all": {"enabled": false}
.
—— 这能实现性能提升, 并节省存储空间.
5.4 设置dynamic = strict
如果你的数据是结构化数据, 就设置"dynamic": "strict"
.
—— 把动态类型判断设置为严格, 也就是不允许elasticsearch为插入的数据进行动态类型设置, 避免注入脏数据.
5.5 使用keyword类型
如果你只关心精确匹配, 就设置ur_field: {"type": "keyword"}
.
—— 这能提高性能, 并节省磁盘的存储空间.
参考资料
版权声明
作者: ma_shoufeng(马瘦风)
出处: 博客园
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
推荐阅读
-
ES 18 - (底层原理) Elasticsearch写入索引数据的过程 以及优化写入过程
-
使用Elasticsearch的动态索引和索引优化
-
ES 17 - (底层原理) Elasticsearch增删改查索引数据的过程
-
ES 10 - Elasticsearch的索引别名和索引模板
-
ES 16 - 对Elasticsearch中的索引数据进行增删改查 (CRUD)
-
使用Elasticsearch的动态索引和索引优化
-
ES 18 - (底层原理) Elasticsearch写入索引数据的过程 以及优化写入过程
-
ES 17 - (底层原理) Elasticsearch增删改查索引数据的过程
-
ES 10 - Elasticsearch的索引别名和索引模板
-
ES 16 - 对Elasticsearch中的索引数据进行增删改查 (CRUD)