値の型によって登録対象のフィールドを分けたい

JSON形式のログを、logstashのjsonフィルターを使用して取り込んでおります。
現状の問題として、ドキュメントにより同じフィールド名(以下、fieldA)でも数値型の場合と文字列型の場合があります。その場合、初回にドキュメントを取り込んだ際に、fieldAが数字の場合、数値型で動的にマッピングされますが、その後に数値以外の文字列がfieldAに設定されていた場合はマッピングエラーとなってしまいます。
例えば、fieldAの値を事前に解析し、数字の場合はfieldA_numberフィールド、その他の文字列の場合はfieldA_textフィールドに格納するといったことは可能でしょうか?

なお、当該ドキュメントはキー名が多岐に渡るため、インデックステンプレートにて予め型を決めておくことが困難です

@t-nakata さん、

なかなか厄介な状況ですね。

他に解決方法があるような気もしますが、興味本位で Logstash の ruby filter を使ってカスタムスクリプトを書いてみました。こちらからダウンロードできます。 rename_by_data_type.rb

使用例:

filter {
  ruby {
    path => '/{path_of_the_ruby_script}/rename_by_data_type.rb'
    script_params => { 'field' => 'the_name_of_target_field' }
  }
}

実行時のイメージ:
二件のメッセージが渡ってきて、同じフィールド名なのに型が違う場合のイメージです。型の名前を元々のフィールド名の末尾に追記するようにしています。

Input:

[
{"values": {"fieldA": "a", "fieldB": "b", "fieldC": "c"}},
{"values": {"fieldA": 1, "fieldB": 2, "fieldC": 3}}
]

Output:

[
{"values": {"fieldA_String": "a", "fieldB_String": "b", "fieldC_String": "c"}},
{"values": {"fieldA_Integer": 1, "fieldB_Integer": 2, "fieldC_Integer": 3}}
]

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.