专栏首页大道七哥logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2

logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2

上篇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)是否加权 除了这些还有其他的一些因素,比如,词库的维护改动,搜索架构的变化等等。 如果前提没有充分的规划好,后期改变的话,改动其中任何一项,都需要重建索引,这个代价是非常大和耗时的,尤其是在一些数据量大的场景中


-END-

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 前端小知识点总结,助力你成功面试!

    1.Doctype的作用:此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范。 2.严格模式与混杂模式如何区分?有何意义? 区分浏览器的使用的标准 ...

    前端老鸟
  • 新手上路:图文解读助你理解和使用正则表达式

    对于大多数没有接受过正式 CS 教育的人来说,正则表达式似乎只有最核心的 Unix 程序员才敢碰。

    机器之心
  • 十分钟实现短链接服务(Node + Express + MongoDB)

    短链接我们或多或少都使用过,所谓短链接就是根据较长的原链接url生成一段较短的链接,访问短链接可以跳转到对应的原链接,这样做好处在于:1. url更加美观;2....

    MudOnTire
  • 测试开发进阶(七)

    zx钟
  • 成为0.01%!利用TensorFlow.js和深度学习,轻松阅读古草体文字

    古文字识别能力是从事历史研究的学者的必备技能,对于日本的历史研究学者而言,他们的挑战则来自于“古草体”文字,这种文字是古日本使用频率最高的文字之一,也将是他们科...

    大数据文摘
  • Postgresql(一) 致不了解的那些事

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    张凝可
  • 周伯通的空明拳,米诺斯的星尘傀儡线,SAP Kyma的Serverless

    Jerry一直认为,金庸的《天龙八部》里的武学建模已经有点脱离传统武侠小说的范畴了,像已经走上玄幻道路的灵鹫宫“八荒六合唯我独尊功”,以及杀伤力足够能被视为现代...

    Jerry Wang
  • 漫谈前端性能优化

    https://www.cnblogs.com/zjstar12/archive/2012/01/12/2320408.html

    一粒小麦
  • SAP Cloud for Customer的Container应用设计原理

    相信大部分C4C的UI developer包括我刚开始的时候都会比较好奇我们平时写的javascript代码是如何运行在移动设备上的,同样的,我也对这个问题十分...

    Jerry Wang
  • webpack工程化及其配置指北(1)

    现在前端脚手架工具已经非常智能化了。早年刚入行我曾经自己在项目里配过webpack,上午面向百度配置的内容,下午就重复不出来了。后来查了一个下午,才去看pack...

    一粒小麦

扫码关注云+社区

领取腾讯云代金券