標籤:set mapping 區分 clu htm /usr 方式 aging tin
上篇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