1 什么是索引模板

索引模板: 就是把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板, 在创建新索引时, 指定要使用的模板名, 就可以直接重用已经定义好的模板中的设置和映射.

1.1 索引模板中的内容

(1) settings: 指定index的配置信息, 比如分片数、副本数, tranlog同步条件、refresh策略等信息;

(2) mappings: 指定index的内部构建信息, 主要有:

_all: All Field字段, 如果开启, _all字段就会把所有字段的内容都包含进来,检索的时候可以不用指定字段查询 —— 会检索多个字段, 设置方式: "_all": {"enabled": true};

在ES 6.0开始, _all字段被禁用了, 作为替换, 可以通过copy_to自定义实现all字段的功能.

_source: Source Field字段, ES为每个文档都保存一份源数据, 如果不开启, 也就是"_source": {"enabled": false}, 查询的时候就只会返回文档的ID, 其他的文档内容需要通过Fields字段到索引中再次获取, 效率很低. 但若开启, 索引的体积会更大, 此时就可以通过Compress进行压缩, 并通过incluedsexcludes等方式在field上进行限制 —— 指定义允许哪些字段存储到_source中, 哪些不存储;

properties: 最重要的配置, 是对索引结构和文档字段的设置.

1.2 索引模板的用途

索引模板一般用在时间序列相关的索引中.

—— 也就是说, 如果你需要每间隔一定的时间就建立一次索引, 你只需要配置好索引模板, 以后就可以直接使用这个模板中的设置, 不用每次都设置settings和mappings.

索引模板一般与索引别名一起使用. 关于索引别名, 后续研究之后再做补充.

2 创建索引模板

创建一个商品的索引模板的示例:

(1) ES 6.0之前的版本:

  1. PUT _template/shop_template
  2. {
  3. "template": "shop*", // 可以通过"shop*"来适配
  4. "order": 0, // 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高
  5. "settings": {
  6. "number_of_shards": 1 // 分片数量, 可以定义其他配置项
  7. },
  8. "aliases": {
  9. "alias_1": {} // 索引对应的别名
  10. },
  11. "mappings": {
  12. "_default": { // 默认的配置, ES 6.0开始不再支持
  13. "_source": { "enabled": false }, // 是否保存字段的原始值
  14. "_all": { "enabled": false }, // 禁用_all字段
  15. "dynamic": "strict" // 只用定义的字段, 关闭默认的自动类型推断
  16. },
  17. "type1": { // 默认的文档类型设置为type1, ES 6.0开始只支持一种type, 所以这里不需要指出
  18. */
  19. "_source": {"enabled": false},
  20. "properties": { // 字段的映射
  21. "@timestamp": { // 具体的字段映射
  22. "type": "date",
  23. "format": "yyyy-MM-dd HH:mm:ss"
  24. },
  25. "@version": {
  26. "doc_values": true,
  27. "index": "not_analyzed", // 不索引
  28. "type": "string" // string类型
  29. },
  30. "logLevel": {
  31. "type": "long"
  32. }
  33. }
  34. }
  35. }
  36. }

(2) ES 6.0之后的版本:

  1. PUT _template/shop_template
  2. {
  3. "index_patterns": ["shop*", "bar*"], // 可以通过"shop*"和"bar*"来适配, template字段已过期
  4. "order": 0, // 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高
  5. "settings": {
  6. "number_of_shards": 1 // 分片数量, 可以定义其他配置项
  7. },
  8. "aliases": {
  9. "alias_1": {} // 索引对应的别名
  10. },
  11. "mappings": {
  12. // ES 6.0开始只支持一种type, 名称为“_doc”
  13. "_doc": {
  14. "_source": { // 是否保存字段的原始值
  15. "enabled": false
  16. },
  17. "properties": { // 字段的映射
  18. "@timestamp": { // 具体的字段映射
  19. "type": "date",
  20. "format": "yyyy-MM-dd HH:mm:ss"
  21. },
  22. "@version": {
  23. "doc_values": true,
  24. "index": "false", // 设置为false, 不索引
  25. "type": "text" // text类型
  26. },
  27. "logLevel": {
  28. "type": "long"
  29. }
  30. }
  31. }
  32. }
  33. }

说明:

直接修改mapping的优先级 > 索引模板中的设置;

索引匹配了多个template, 当属性等配置出现不一致时, 以模板的权重(order属性的值)为准, 值越大越优先, order的默认值是0.

ES 6.0之后的版本API变化较大, 请重点关注.

3 查看索引模板

(1) 查看示例:

  1. GET _template // 查看所有模板
  2. GET _template/temp* // 查看与通配符相匹配的模板
  3. GET _template/temp1,temp2 // 查看多个模板
  4. GET _template/shop_template // 查看指定模板

(2) 判断模板是否存在:

判断示例:

  1. HEAD _template/shop_tem

结果说明:

a) 如果存在, 响应结果是: 200 - OK

b) 如果不存在, 响应结果是: 404 - Not Found

4 删除索引模板

删除示例:

  1. DELETE _template/shop_template // 删除上述创建的模板

如果模板不存在, 将抛出如下错误:

  1. {
  2. "error" : {
  3. "root_cause" : [
  4. {
  5. "type" : "index_template_missing_exception",
  6. "reason" : "index_template [shop_temp] missing"
  7. }
  8. ],
  9. "type" : "index_template_missing_exception",
  10. "reason" : "index_template [shop_temp] missing"
  11. },
  12. "status" : 404
  13. }

5 模板的使用建议

5.1 一个index中不能有多个type

—— Elasticsearch 6.X版本中已经不支持在同一个index下创建多个type.

6.X之前的版本中, 父子文档的实现是一个索引中定义多个type, 6.X中实现方式改变为join方式.

如果在同一个index下创建多个type, 会报出如下错误信息:

  1. {
  2. "error": {
  3. "root_cause": [
  4. {
  5. "type": "illegal_argument_exception",
  6. "reason": "Rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]"
  7. }
  8. ],
  9. "type": "illegal_argument_exception",
  10. "reason": "Rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]"
  11. },
  12. "status": 400
  13. }

错误信息指出: 拒绝对[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}.

—— 这能实现性能提升, 并节省存储空间.

而在6.X版本开始, _all字段也不再支持了, ES官方建议我们通过copy_to自定义我们自己的all字段.

5.4 设置dynamic = strict

如果我们的数据是结构化数据, 就设置"dynamic": "strict".

—— 把动态类型判断设置为严格, 也就是不允许ES为插入的数据进行动态类型设置, 避免注入脏数据.

5.5 使用keyword类型

如果我们只关心精确匹配, 就设置test_field: {"type": "keyword"}.

—— keyword类型要比text类型的性能更高, 并且还能节省磁盘的存储空间.

参考资料

官方文档(6.6) - Index Templates

初探 Elasticsearch Index Template(索引模板)

Elasticsearch之索引模板index template与索引别名index alias

版权声明

作者: 瘦风(https://healchow.com)

出处: 博客园 瘦风(https://www.cnblogs.com/shoufeng)

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶

ES 10 - Elasticsearch的索引别名和索引模板的更多相关文章

  1. Elasticsearch 索引别名与Template

    在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景. 为了方便数据淘汰,并使得数据管理更加灵活,我们经常会以时间为粒度建立索引,例如: 每个月建立一个索引:monthly-20 ...

  2. Elasticsearch索引别名、Filtered索引别名、Template

    在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景. 为了方便数据淘汰,并使得数据管理更加灵活,我们经常会以时间为粒度建立索引,例如: 每个月建立一个索引:monthly-20 ...

  3. 使用索引别名和Rollover滚动创建索引

    使用索引别名和Rollover滚动创建索引 在ElasticSearch6.3.2 集群做节点冷(warm) 热(hot) 分离中,实现了ElasticSearch集群节点的冷热分离,新创建的索引只允 ...

  4. Elasticsearch之索引模板index template与索引别名index alias

    为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...

  5. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  6. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...

  7. elasticsearch 5.x 系列之七 基于索引别名的零停机升级服务

    一,写在前面的话,elasticsearch 建立索引时的Mapping 设置 建议你在设计索引的初期,就把索引的各个字段设计好,因为,elasticsearch 的各个字段,定义好类型后,就无法进行 ...

  8. 利用别名切换索引流程Elasticsearch 7.7

    背景 公司里面现在有es集群,由于时间过长,es集群中的某个索引过大但是未删除,一直在写入的情况下,昨天写入突然停止了,发现是索引超时的问题,这时想到通过创建一个新的索引来进行索引切换 操作 es 集 ...

  9. Elasticsearch 通关教程(三): 索引别名Aliases问题

    业务问题 业务需求是不断变化迭代的,也许我们之前写的某个业务逻辑在下个版本就变化了,我们可能需要修改原来的设计,例如数据库可能需要添加一个字段或删减一个字段,而在搜索中也会发生这件事,即使你认为现在的 ...

随机推荐

  1. SOFA 源码分析 — 预热权重

    前言 SOFA-RPC 支持根据权重对服务进行预热功能,具体地址:预热权重. 引用官方文档: 预热权重功能让客户端机器能够根据服务端的相应权重进行流量的分发.该功能也常被用于集群内少数机器的启动场景. ...

  2. NoHttp封装--03 缓存

    1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...

  3. Flask构建微电影(二)

    第三章.项目分析.搭建目录及模型设计 3.1.前后台项目目录分析 微电影网站 前台模块 后台模块 前台(home) 数据模型:models.py 表单处理:home/forms.py 模板目录:tem ...

  4. [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis

    上一章 [ 搭建Redis本地服务器实践系列一 ] :图解CentOS7安装Redis 详细的介绍了Redis的安装步骤,那么只是安装完成,此时的Redis服务器还无法正常运作,我们需要对其进行一些配 ...

  5. 【转】Javascript错误处理——try…catch

    无论我们编程多么精通,脚本错误怎是难免.可能是我们的错误造成,或异常输入,错误的服务器端响应以及无数个其他原因. 通常,当发送错误时脚本会立刻停止,打印至控制台. 但try...catch语法结构可以 ...

  6. 进击Node.js基础(一)

    一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. ...

  7. 有趣的toggleClass实现交替样式

    addClass和removeClass进行样式类型的修改相信比较容易学习和接受 但是用这两个方法去实现交替样式,像一些<li>列表的样式,还有同类型数据的呈现, 当然很多框架都给出了封装 ...

  8. sql复杂案例

    工作中往往会遇到非常棘手的数据查询,运营人员不知道你的数据库表是如何设计的,也不知道你的数据库记录了啥数据,他只知道自己需要看什么数据,甚至有些数据根本就不存在. 单表查询的难度: 一张数据库的表ta ...

  9. ATM机

    ATM 要求 示例代码: https://github.com/triaquae/py_training/tree/master/sample_code/day5-atm

  10. Oracle 重建控制文件一例

    环境:OEL 5.7 + Oracle 10.2.0.5 背景:在Oracle的运维过程中,时常会遇到一些场景是需要重建控制文件才可以解决的.本文的场景可以通过复制控制文件到新路径,运行一段时间后,再 ...