logstash elasticsearchにデータを出力する際のダイナミックマッピングテンプレートの問題
9062 ワード
logstash-input-jdbcプラグインを使用してmysqlデータをelasticsearchに同期すると、デフォルトのダイナミックマッピングテンプレートが使用され、テンプレート名はlogstashです.logstashの起動中に次の情報が表示されます.
Using mapping template from {:path=>nil}
Attempting to install template{:manage_template=>{"template"=>"logstash-*","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,"fields"=>{"keyword"=>{"type"=>"keyword"}}}}}],"properties"=>{"@timestamp"=>{"type"=>"date","include_in_all"=>false},"@version"=>{"type"=>"keyword","include_in_all"=>false},"geoip"=>{"dynamic"=>true,"properties"=>{"ip"=>{"type"=>"ip"},"location"=>{"type"=>"geo_point"},"latitude"=>{"type"=>"half_float"},"longitude"=>{"type"=>"half_float"}}}}}}}}
Installing elasticsearch template to_template/logstash
最初の行path=>nilは、カスタムテンプレートが見つからないことを示しています.デフォルトテンプレートを使用し、最後にelasticsearchテンプレートパスにテンプレートを格納し、logstashで名前を付けます.テンプレートの内容:
{
"template":"logstash-*",
"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,
"fields":{
"keyword": {
"type": "keyword"
}
}
}
}
}
],
"properties": {
"@timestamp": {
"type":"date",
"include_in_all":false
},
"@version": {
"type":"keyword",
"include_in_all":false
},
"geoip": {
"dynamic": true,
"properties": {
"ip": {
"type":"ip"
},
"location": {
"type":"geo_point"
},
"latitude": {
"type":"half_float"
},
"longitude":{
"type":"half_float"
}
}
}
}
}
}
}
彼は同期したフィールドを自動的にマッピングしてくれますが、ほとんどのtextタイプが分詞しているのがよくありません.私自身のニーズは分詞していないので、マッピングをカスタマイズします.最初はテンプレートの優先度に気づかなかったので、テンプレートの構成を変更していません.すべてがデフォルトですが、logstashを起動する前にcurlを使いました. -XPUTコマンドは、esクラスタ上で単語を区別しないマッピングを作成しますが、データの同期が完了しても有効ではないことがわかり、logstashのoutputプラグインの優先度がクラスタ上で作成したマッピングよりも高いことに気づきました.次にテンプレートを変更し、デフォルトを上書きします.
まず、デフォルトのテンプレートをコマンドで削除します.
curl –XDELETE–u elastic ‘192.168.11.31:8011/_template/logstash’
それから1つのファイルes-template.jsonを新設して、名前は勝手に起きて、デフォルトのテンプレートの内容の上で少し修正して、くっついて、私のここはtextタイプをすべて単語を分けないで、すぐにテンプレートの内容です
{
"template": "my_index",
"settings": {
"index.refresh_interval":"5s"
},
"mappings": {
"_default_": {
"_all": {"enabled":false, "omit_norms": true},
"dynamic_templates": [ {
"message_field": {
"match":"message",
"match_mapping_type":"string",
"mapping": {
"type":"string", "index": "not_analyzed","omit_norms": true,
"fielddata": {"format": "disabled"}
}
}
}, {
"string_fields": {
"match":"*",
"match_mapping_type":"string",
"mapping": {
"type":"string", "index": "not_analyzed","omit_norms": true,
"fielddata": {"format": "disabled"},
"fields": {
"raw":{"type": "string", "index":"not_analyzed", "ignore_above": 256}
}
}
}
} ]
}
}
}
次にlogstashの起動ファイルjdbc.confのoutputモジュール構成です.
if[type] =="my_type"{
elasticsearch {
hosts => ["192.168.110.31:8011","192.168.110.31:8012","192.168.110.31:8013"]
user => "elastic"
password => "abc123qwer"
index => "my_index"
document_id => "%{id}"
#manage_template =>"false"
template =>"/home/lvyuan/elasticsearch/logstash-5.5.3/template/es-template.json"
template_name =>"my_index"
template_overwrite =>"true"
}
}
起動前に以前作成したインデックスとテンプレートを削除し、起動後に有効でないことが判明した場合は、必ずインデックスとテンプレート(このテンプレート物理ファイルではなく_templateに格納されているテンプレート)を削除してから変更して実行してください.
curl -XDELETE-u elastic 'http://192.168.110.31:8011/_template/my_index'
curl -XDELETE-u elastic 'http://192.168.110.31:8011/my_index'
mysqlのsql文クエリーの代わりにelasticsearchを使用するのが目的なので、全文検索をしたくないので、分詞は私の機能にも影響を与える可能性があります.例えば、mysqlには大文字と小文字の混在するアルファベットシーケンス(eg:HTZG 5 jjhffdwe)が格納されています.デフォルトのマッピングテンプレート(分詞可能)を使用するととなると、このアルファベット順をすべて小文字にしてtokenに格納してしまうので、termQuery(分詞せず、正確に一致)では見つからないに違いありませんが、matchPhraseQueryを使ってもいいと言う人もいます.これは確かに調べられますが、プレフィックスで一致したい場合はprefixQuery(分詞なし)では調べられないので、小文字で「htzg 5」を使います最初の接頭辞は一致しますが、大文字では一致しません.token表には小文字ばかりで、一致しないに違いありません.具体的な状況を具体的に分析すると、すべての場合に分詞すべきではありません.試してみてください.
http://localhost:8011/_analyze?pretty&analyzer=standard&text=HTZG5jjhffdEX7w52r37880 すべて小文字に変換してtokenに格納
:{"tokens":[{"token":"htzg5jjhffdex7w52r37880","start_offset":0,"end_offset":22,"type":"","position":0}]}
参照先:http://blog.csdn.net/asia_kobe/article/details/51192848
http://www.cnblogs.com/NextNight/p/6860283.html
http://www.cnblogs.com/cocowool/p/elk_dynamic_templates.html
https://elasticsearch.cn/article/21
http://m.blog.csdn.net/u012516166/article/details/75106184
Using mapping template from {:path=>nil}
Attempting to install template{:manage_template=>{"template"=>"logstash-*","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,"fields"=>{"keyword"=>{"type"=>"keyword"}}}}}],"properties"=>{"@timestamp"=>{"type"=>"date","include_in_all"=>false},"@version"=>{"type"=>"keyword","include_in_all"=>false},"geoip"=>{"dynamic"=>true,"properties"=>{"ip"=>{"type"=>"ip"},"location"=>{"type"=>"geo_point"},"latitude"=>{"type"=>"half_float"},"longitude"=>{"type"=>"half_float"}}}}}}}}
Installing elasticsearch template to_template/logstash
最初の行path=>nilは、カスタムテンプレートが見つからないことを示しています.デフォルトテンプレートを使用し、最後にelasticsearchテンプレートパスにテンプレートを格納し、logstashで名前を付けます.テンプレートの内容:
{
"template":"logstash-*",
"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,
"fields":{
"keyword": {
"type": "keyword"
}
}
}
}
}
],
"properties": {
"@timestamp": {
"type":"date",
"include_in_all":false
},
"@version": {
"type":"keyword",
"include_in_all":false
},
"geoip": {
"dynamic": true,
"properties": {
"ip": {
"type":"ip"
},
"location": {
"type":"geo_point"
},
"latitude": {
"type":"half_float"
},
"longitude":{
"type":"half_float"
}
}
}
}
}
}
}
彼は同期したフィールドを自動的にマッピングしてくれますが、ほとんどのtextタイプが分詞しているのがよくありません.私自身のニーズは分詞していないので、マッピングをカスタマイズします.最初はテンプレートの優先度に気づかなかったので、テンプレートの構成を変更していません.すべてがデフォルトですが、logstashを起動する前にcurlを使いました. -XPUTコマンドは、esクラスタ上で単語を区別しないマッピングを作成しますが、データの同期が完了しても有効ではないことがわかり、logstashのoutputプラグインの優先度がクラスタ上で作成したマッピングよりも高いことに気づきました.次にテンプレートを変更し、デフォルトを上書きします.
まず、デフォルトのテンプレートをコマンドで削除します.
curl –XDELETE–u elastic ‘192.168.11.31:8011/_template/logstash’
それから1つのファイルes-template.jsonを新設して、名前は勝手に起きて、デフォルトのテンプレートの内容の上で少し修正して、くっついて、私のここはtextタイプをすべて単語を分けないで、すぐにテンプレートの内容です
{
"template": "my_index",
"settings": {
"index.refresh_interval":"5s"
},
"mappings": {
"_default_": {
"_all": {"enabled":false, "omit_norms": true},
"dynamic_templates": [ {
"message_field": {
"match":"message",
"match_mapping_type":"string",
"mapping": {
"type":"string", "index": "not_analyzed","omit_norms": true,
"fielddata": {"format": "disabled"}
}
}
}, {
"string_fields": {
"match":"*",
"match_mapping_type":"string",
"mapping": {
"type":"string", "index": "not_analyzed","omit_norms": true,
"fielddata": {"format": "disabled"},
"fields": {
"raw":{"type": "string", "index":"not_analyzed", "ignore_above": 256}
}
}
}
} ]
}
}
}
次にlogstashの起動ファイルjdbc.confのoutputモジュール構成です.
if[type] =="my_type"{
elasticsearch {
hosts => ["192.168.110.31:8011","192.168.110.31:8012","192.168.110.31:8013"]
user => "elastic"
password => "abc123qwer"
index => "my_index"
document_id => "%{id}"
#manage_template =>"false"
template =>"/home/lvyuan/elasticsearch/logstash-5.5.3/template/es-template.json"
template_name =>"my_index"
template_overwrite =>"true"
}
}
起動前に以前作成したインデックスとテンプレートを削除し、起動後に有効でないことが判明した場合は、必ずインデックスとテンプレート(このテンプレート物理ファイルではなく_templateに格納されているテンプレート)を削除してから変更して実行してください.
curl -XDELETE-u elastic 'http://192.168.110.31:8011/_template/my_index'
curl -XDELETE-u elastic 'http://192.168.110.31:8011/my_index'
mysqlのsql文クエリーの代わりにelasticsearchを使用するのが目的なので、全文検索をしたくないので、分詞は私の機能にも影響を与える可能性があります.例えば、mysqlには大文字と小文字の混在するアルファベットシーケンス(eg:HTZG 5 jjhffdwe)が格納されています.デフォルトのマッピングテンプレート(分詞可能)を使用するととなると、このアルファベット順をすべて小文字にしてtokenに格納してしまうので、termQuery(分詞せず、正確に一致)では見つからないに違いありませんが、matchPhraseQueryを使ってもいいと言う人もいます.これは確かに調べられますが、プレフィックスで一致したい場合はprefixQuery(分詞なし)では調べられないので、小文字で「htzg 5」を使います最初の接頭辞は一致しますが、大文字では一致しません.token表には小文字ばかりで、一致しないに違いありません.具体的な状況を具体的に分析すると、すべての場合に分詞すべきではありません.試してみてください.
http://localhost:8011/_analyze?pretty&analyzer=standard&text=HTZG5jjhffdEX7w52r37880 すべて小文字に変換してtokenに格納
:{"tokens":[{"token":"htzg5jjhffdex7w52r37880","start_offset":0,"end_offset":22,"type":"","position":0}]}
参照先:http://blog.csdn.net/asia_kobe/article/details/51192848
http://www.cnblogs.com/NextNight/p/6860283.html
http://www.cnblogs.com/cocowool/p/elk_dynamic_templates.html
https://elasticsearch.cn/article/21
http://m.blog.csdn.net/u012516166/article/details/75106184