公司ELK系统目前的设置是每月自动将日志信息记录至新的索引中,将日志数据按月分索引保存,在扩展的ELK架构中,利Logstash对接rabbitmq,获取日志消息,自动持久化至Elasticsearch。而Elasticsearch存在一个关键问题就是索引的设置及字段的属性指定,最常见的问题就是,某个字段我们并不希望ES对其进行分词,但如果使用自动模板创建索引,那么默认是所有string类型的字段都会被分词的,因此必须要显式指定字段的not_analyzed属性,其它的比如控制索引的备份数,分片数等,也可以通过模板的套用来实现,并且模板可以通过通配符进行模糊匹配,即可对满足某一通配符的所有新建索引均套用统一模板,不需要为每个索引都建立模板。但也有一点局限性需要注意:模板在设置生效后,仅对ES集群中新建立的索引生效,而对已存在的索引及时索引名满足模板的匹配规则,也不会生效,因此如果需要改变现有索引的mapping信息,仍需要在正确的mapping基础上建立新的索引,并将数据从原索引拷贝至新索引,变更新索引别名为原索引这种方式来实现(改方法适用当前ES版本(1.7+~2.4+)),也许未来会有索引的直接迁移方案。


方案选择:

方案一:可对logstash配置output参数:

如下所示:

这种方案在logstash中指定模板文件,由logstash将template写入ES集群;

方案二:直接将template写入ES集群

通过ES提供的API,将JSON格式的template写入目标ES集群的_template路径,对新生成的所有符合过滤规则的索引直接套用该模板。


这里我直接选择了方案二,因为不想修改logstash的docker镜像中的配置文件...

模板的结构大致分四块吧:

第一部分:通用设置,主要是模板匹配索引的过滤规则,影响该模板对哪些索引生效;

第二部分:settings:配置索引的公共参数,比如索引的replicas,以及分片数shards等参数;

第三部分:mappings:最重要的一部分,在这部分中配置每个type下的每个field的相关属性,比如field类型(string,long,date等等),是否分词,是否在内存中缓存等等属性都在这部分配置;

第四部分:aliases:索引别名,索引别名可用在索引数据迁移等用途上。

典型的一个template如下所示:

{
        "template": "ld.log-*",
        "order":0,
        "settings": {
            "index.number_of_replicas": "1",
            "index.number_of_shards": "5"
        },
        "mappings": {
            "logs": {
                "properties": {
                    "@timestamp": {
                        "type": "date",
                        "format": "strict_date_optional_time||epoch_millis"
                    },
                    "@version": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "Exp": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "Guid": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "LogLevel": {
                        "type": "long"
                    },
                    "LogTime": {
                        "type": "date",
                        "format": "strict_date_optional_time||epoch_millis"
                    },
                    "LoggerName": {
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "Message": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "ProcessId": {
                        "type": "long"
                    },
                    "StackTrace": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "ThreadId": {
                        "type": "long"
                    },
                    "exp": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "logLevel": {
                        "type": "long"
                    },
                    "logTime": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "loggerName": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "message": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "processId": {
                        "type": "long"
                    },
                    "tags": {
                        "doc_values": true,
                        "index": "not_analyzed",
                        "type": "string"
                    },
                    "threadId": {
                        "type": "long"
                    }
                }
            }
        },
        "aliases": {
        }
}

在这个JSON中可以清楚地看到四个部分,并且对string类型的fields设置了不进行默认分词信息。

将这个JSON内容作为PUT请求的BODY(如果是修改template则发送POST请求)发送至目标ES集群(需要指定template的名字,如下例的log_template):

成功后将返回如下信息:

{
   "acknowledged": true
}

现在可以通过对集群_template目录直接发送请求(也可以加上template名称)来查看集群当前的模板信息:


按照如上步骤,template正常添加至ES集群之后,在新增索引之前,会自动与模板进行匹配,如果满足过滤条件,即可套用目标模板来新建索引。

Elasticsearch索引自动套用模板的更多相关文章

  1. Elasticsearch索引自动删除

    简介 脚本分2部分,1部分查找符合条件的索引名,2脚本调用1脚本,进行删除操作 脚本 查找符合条件的,默认大于30天 # coding:utf-8 __author__ = 'Jipu FANG' f ...

  2. elasticsearch索引自动清理

    一 es 基本操作 查看所有的索引文件:  curl -XGET http://localhost:9200/_cat/indices?v GET /_cat/indices?v DELETE /fi ...

  3. Elasticsearch索引(company)_Centos下CURL增删改

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...

  4. ES3:ElasticSearch 索引

    ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量 ...

  5. Elasticsearch索引和文档操作

    列出所有索引 现在来看看我们的索引 GET /_cat/indices?v 响应 health status index uuid pri rep docs.count docs.deleted st ...

  6. Elasticsearch索引原理

    转载 http://blog.csdn.net/endlu/article/details/51720299 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计 ...

  7. windows系统中 利用kibana创建elasticsearch索引等操作

    elasticsearch之借用kibana平台创建索引 1.安装好kibana平台 确保kibana以及elasticsearch正常运行 2.打开kibana平台在Dev Tools 3.创建一个 ...

  8. Elasticsearch索引按月划分以及获取所有索引数据

    项目中数据库根据月份水平划分,由于没有用数据库中间件,没办法一下查询所有订单信息,所有用Elasticsearch做订单检索. Elasticsearch索引和数据库分片同步,也是根据月份来建立索引. ...

  9. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

随机推荐

  1. FlashBuilder项目环境配置

    一 .安装Flash Builder 1.  修改host文件 1.1 找到host文件,复制到桌面修改. 在"C:\Windows\System32\drivers\etc"文件 ...

  2. mysql can't create threads in threadpool

    最近,我们在券商端的mysql运行一段时间后,发生mysql can't create threads in threadpool,如下所示: 据官网一个报告显示,目测是一个bug,内存紧张导致,那天 ...

  3. 9.2.3 .net core 通过TagHelper封装控件

    .net core 除了继续保留.net framework的HtmlHelper的写法以外,还提供了TagHelper和ViewComponent方式生成控件. 我们本节说的是使用TagHelper ...

  4. CSS3 border-radius 圆角属性

    使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. -webkit- 或 -moz- ...

  5. 全国SHP地图数据赠送

    百度搜索:GIS之家获取全国SHP图层数据的方式:收藏(ArcGIS地图全国电子地图shp格式版本GIS地图数据.GIS开发顺德政府GIS公共服务共享平台),并且截图验证,验证通过后,收下邮箱,我把下 ...

  6. ZeroC Ice启用SSL通讯的配置

    Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...

  7. Undefined symbols for architecture arm64:

    1. 没有往项目中导入静态库(.a 文件)需要的 framework. 2.拖到项目中的静态库不支持arm64(或其他)指令集  这种情况没遇到过 一般都是第一种情况.

  8. 【代码笔记】iOS-获得当前硬盘空间

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  9. 生成freeswitch事件的几种方式

    本文描述了生成freeswitch事件的几种方式,这里记录下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 在freeswitch代码中加入事件 ...

  10. count(*) 与count (字段名)的区别

    count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数