首页 > 数据库技术 > 详细

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

时间:2017-10-22 01:06:07      阅读:922      评论:0      收藏:0      [点我收藏+]

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

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

好的,首先看一下之前简单使用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
                }
            }
        }
    }
}
~ 

注释:注意上面的文件中 "template": "*",这里这么写会覆盖logstash自身(在不指定mapping 模板时候)默认的采用的数据mapping匹配模板,要是不想覆盖默认换个名字就行

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针对每个字段写死就好:

TODO、、

 

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

原文:http://www.cnblogs.com/jstarseven/p/7707499.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!