logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2_weixin_30856965的博客-程序员秘密

技术标签: json  数据库  大数据  

上篇blog说到采用logstash-input-jdbc将mysql数据同步到ES(http://www.cnblogs.com/jstarseven/p/7704893.html),但是这里有一个问题,即假如我不需要logstash自动对mysql数据提供的mapping模板怎么办,毕竟我的数据需要ik分词,同义词解析等。。。

这时候就需要用到logstash的template功能了 ,如果现在还不到logstash和logstash-input-jdbc的安装使用方式的建议先看上一篇文章。--------jstarseven

转载请注明原文出处:http://www.cnblogs.com/jstarseven/p/7707499.html 

好的,首先看一下之前简单使用logstash-input-jdbc导入es的配置文件mysql.conf(一会配置template时候需要修改):

input {
    stdin {
    }
    jdbc {
      # 数据库
      jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test"
      # 用户名密码
      jdbc_user => "root"
      jdbc_password => "123456"
      # jar包的位置
      jdbc_driver_library => "/usr/local/logstash-5.5.2/bin/config-mysql/mysql-connector-java-5.1.31.jar"
      # mysql的Driver
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      #statement_filepath => "config-mysql/test02.sql"
      statement => "select * from my_into_es "
      schedule => "* * * * *"
      #索引的类型
      type => "my_into_es_type"
    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    elasticsearch {
        hosts => "127.0.0.1:9200"
        # index名
        index => "my_into_es_index"
        # 需要关联的数据库中有有一个id字段,对应索引的id号
        document_id => "%{id}"
    }
    stdout {
        codec => json_lines
    }
}

  现在,我们来看template模板怎么用:

第一种采用我个人将它称为动态模板:dynamic_templates 可以做到对某种类型字段进行匹配mapping

1. 切换路径  cd  /usr/local/logstash-5.5.2 目录下

2. 新建template目录 mkdir template

3. cd template

4. 新建文件 logstash-ik.json   

5. 编辑文件内容:

{
    "template": "*",
    "version": 50001,
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": true,
                "norms": false
            },
            "dynamic_templates": [
                {
                    "message_field": {
                        "path_match": "message",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false
                        }
                    }
                },
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",
                            "norms": false,
                            "analyzer": "ik_max_word",
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        }
                    }
                }
            ],
            "properties": {
                "@timestamp": {
                    "type": "date",
                    "include_in_all": false
                },
                "@version": {
                    "type": "keyword",
                    "include_in_all": false
                }
            }
        }
    }
}
~ 

6. cd /usr/local/logstash-5.5.2/bin/config-mysql

7.新建文件 mkdir mysql-ik-define.conf

文件内容:

input {
    stdin {
    }
    jdbc {
      # 数据库
      jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test"
      # 用户名密码
      jdbc_user => "root"
      jdbc_password => "123456"
      # jar包的位置
      jdbc_driver_library => "/usr/local/logstash-5.5.2/bin/config-mysql/mysql-connector-java-5.1.31.jar"
      # mysql的Driver
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "50000"
      #statement_filepath => "config-mysql/test02.sql"
      statement => "select * from my_into_es_define"
      schedule => "* * * * *"
      #索引的类型
      type => "into_es_type_define_ik"
    }
}

filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
    elasticsearch {
        hosts => "127.0.0.1:9200"
        # index名
        index => "into_es_index_define_ik"
        # 需要关联的数据库中有有一个id字段,对应索引的id号
        document_id => "%{id}"
        template_overwrite => true
        template => "/usr/local/logstash-5.5.2/template/logstash-ik.json"
    }
    stdout {
        codec => json_lines
    }
}

注释:上面标颜色的就是template的配置,其他基本不变

8. cd /usr/local/logstash-5.5.2/bin

9. 执行命令:./logstash -f config-mysql/mysql-ik-define.conf 

观察日志:

10.我们拿ElasticSearch-head插件看一下新建好的mapping:

和我们预料的一样没有问题,数据也成功导入:

总结:这种配置方式个人觉得比较灵活可以对字段按类区分做mapping

第二种采用我个人将它称为静态模板(其实和上面的基本一致),就是template文件不一样,mapping针对每个字段写死就好:

1.在之前的template目录下新建logstash-ik-define.json文件:

{
    "template": "*",
    "version": 50001,
    "settings": {
        "index.refresh_interval": "5s"
     },
    "mappings": {
        "into_es_type_define" :{
         "properties": {
               "ct": {
                    "type": "date"
                },
                "@timestamp": {
                   "include_in_all": false,
                   "type": "date"
                },
               "@version": {
                  "include_in_all": false,
                  "type": "keyword"
                },
               "name": {
                  "norms": false,
                  "analyzer": "ik_max_word",
                  "type": "text",
                  "fields": {
                     "keyword": {
                        "type": "keyword"
                         }
                    }
                },
                "id": {
                    "type": "long"
                },
                "type": {
                     "norms": false,
                     "analyzer": "ik_max_word",
                     "type": "text",
                     "fields": {
                     "keyword": {
                         "type": "keyword"
                          }
                    }
                },
                "age": {
                   "type": "long"
                },
                "desc": {
                    "norms": false,
                    "analyzer": "ik_max_word",
                    "type": "text",
                    "fields": {
                    "keyword": {
                         "type": "keyword"
                         }
                     }
                },
               "ut": {
                      "type": "date"
                 }    
            }
        }
    }
}

2.修改上述 mysql-ik-define.conf文件里面的index,type,和template部分应用模板文件即可

3.执行命令:./logstash -f config-mysql/mysql-ik-define.conf

4.查看head里面的mapping新建情况和template文件中mapping保持一致:

 

5.数据也成功同步:

 

总结:template模板使用

1.静态模板 :
                     适合索引字段数据固定的场景,一旦配置完成,不能向里面加入多余的字段,否则会报错
                     优点:scheam已知,业务场景明确,不容易出现因字段随便映射从而造成元数据撑爆es内存,从而导致es集群全部宕机
                     缺点:字段数多的情况下配置稍繁琐

1.动态模板 :
      适合字段数不明确,大量字段的配置类型相同的场景,多加字段不会报错
                     优点:可动态添加任意字段,无须改动scheaml,
                     缺点:如果添加的字段非常多,有可能造成es集群宕机

定制索引模板,是搜索业务中一项比较重要的步骤,需要注意的地方有很多,比如:
       (1)字段数固定吗
       (2)字段类型是什么
       (3)分不分词
       (4)索引不索引
       (5)存储不存储
       (6)排不排序
       (7)是否加权
除了这些还有其他的一些因素,比如,词库的维护改动,搜索架构的变化等等。
如果前提没有充分的规划好,后期改变的话,改动其中任何一项,都需要重建索引,这个代价是非常大和耗时的,尤其是在一些数据量大的场景中

 

转载于:https://www.cnblogs.com/jstarseven/p/7707499.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30856965/article/details/97764307

智能推荐

页面的回流与重绘_重绘和回流_前端历劫之路的博客-程序员秘密

页面呈现的具体过程Step1浏览器把获取到的HTML代码解析成1个DOM树,HTML中的每个tag都是DOM树中的1个节点,根节点就是我们常用的document对象。DOM树里包含了所有HTML标签,包括使用了display:none隐藏的元素,还有用JS动态添加的元素等。Step2浏览器把所有样式(用户定义的CSS和用户代理)解析成样式结构体(CSSOM树),在解析的过程中会去掉浏览器不能识别的样式,比如IE会去掉-moz开头的样式,而FF会去掉_开头的样式。Step3DOM树和样式结构体(

js调用java_JsBridge实现Javascript和Java的互相调用_雪山战鹰的博客-程序员秘密

前端网页Javascript和Native互相调用在手机应用中越来越常见,JsBridge是最常用的解决方案。在Android开发中,能实现Javascript与Native代码通信的,有4种途径:1.JavascriptInterface2.WebViewClient.shouldOverrideUrlLoading()3.WebChromeClient.onConsoleMessage()4....

动态添加Li标签,实现电影排行榜_li前面的排名怎么写的_zzzhhnice的博客-程序员秘密

动态添加Li标签,实现电影排行榜~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~开发工具与关键技术: DW作者:韩日九儿撰写时间:2021/7/181.从用户的视角看电影排行榜如下图。2.当用户将鼠标移动到某电影区域时,弹出该电影的封面图和简介。3.电影排行榜的HTML结构如图。4. 电影排行榜的CSS样式通过JS的引用而生效。

Javascript创建沙箱_ZTao-z的博客-程序员秘密

用途在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。实现原理构建with块级作用域限制局部变量with语句 能改变变量的作用域链,使得程序在查找变量值时,都是先在with指定的对象中查找,然后再往上查找使用ES6的Proxy限制变量向上查找Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,

面试题:Integer和int的区别?在什么时候用Integer和什么时候用int_绝地反击T的博客-程序员秘密

/* * int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0, * 而Integer的默认值为null * ,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别 * ,则只能使用Integer * 。在JSP

通信协议制定_od_entry_t_阳光守望者Coder的博客-程序员秘密

通信协议定义    用于实现计算机与网络连接之间的标准,网络如果没有统一的通信协议,电脑 之间的信息传递就无法识别。 通信协议是指通信各方事前约定的用心规则,我们可以简单地理解为各计算机之间进行相互会话所使用的共同语言.两台计算机在进行通信时,必须使用的通信协议。通信协议的种类和特点    目前常见的通信协议主要有:NetBEUI、IPX/SPX、NWL

随便推点

MFC编译程序,缺少MFC动态链接库的解决_weixin_33690963的博客-程序员秘密

MFC编译程序,缺少MFC动态链接库的解决问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法解决方法: 1.将这些dll打包,和应用程序一起发布; 2.采用MFC静态编译;附1:VS2010中静态编译设置方法使用VS2010编译的程序在windows xp中运行时 经常会出现找不到 相关的DLL文...

装机 —— 主板_柚咖的博客-程序员秘密

CPU、内存、固态、硬盘、网卡、声卡等硬件都是需要插到主板上的,主板就是为了承载和连通硬件,使其一起工作。接下来了解下如何选择一款好的主板。1. 支持的平台选主板最大的坑在于 Intel 和 AMD 这两款 CPU 的主板是不同的,无法兼容。如果你购买了一款 AMD 的 CPU,而主板选择了 Intel 平台的主板,那么是没有办法安装的。这主要是因为 Intel 和 AMD 这两家 CPU 的针脚是不同的,就好比两脚插头和三脚插头的区别,因此在 DIY 电脑时,要先选择一款心仪的 CPU,然后根据这款

深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析_spark dag执行引擎_小爷毛毛(卓寿杰)的博客-程序员秘密

上一篇《深入理解Spark 2.0 (一):RDD实现及源码分析 》的5.2 Spark任务调度器我们省略过去了,这篇我们就来讲讲Spark的调度器。概述上一篇《深入理解Spark(一):RDD实现及源码分析 》提到: 定义RDD之后,程序员就可以在动作(注:即action操作)中使用RDD了。动作是向应用程序返回值,或向存储系统导出数据的那些操作,例如,count(返回RDD...

在CSDN中如何使用markdown编辑器—完全指南_csdn中如何编辑markdown_u014789708的博客-程序员秘密

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...

educoder算法设计与分析 实验六 分支界限法_xingcheng--dp的博客-程序员秘密

实验六 分支界限法第1关:0-1背包第2关:装载问题 (最优队列法)第1关:0-1背包题目描述: 任务要求输出一个数,代表能装入的最大价值测试输入:4 73 5 2 19 10 7 4预期输出:20分析:无代码实现:#include <iostream>#include <algorithm> //sort函数包含的头文件using namespace std;typedef struct p{ struct p *pr; i

Java文件流 字节流和字符流_Fly_TheWind的博客-程序员秘密

Java 流分成2大类:1.字节流2.字符流顾名思义 字节流就是内容以字节的形式存储在流中,字符流则以字符的形式存储在流中,一般而言,字符流只用来处理纯文本文件,而字节流则可以用来处理文本,图片,视频,音频等。而对于字符流和字节流来说都可以分成输入输出两部分,所以可以分成:       字节流      字符流

推荐文章

热门文章

相关标签