作者:bunnyvivi | 来源:互联网 | 2023-05-16 22:22
上篇blog说到采用logstash-input-jdbc将mysql数据同步到ES(http:www.cnblogs.comjstarsevenp7704893.html),但是这里有一个
上篇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、、