2016-12-27 24 views
0

logstashへの入力として以下のJSONがあります。Jsonファイル内のネストされたフィールドのlogstash設定ファイルでMutate/Convertを使用する方法

{ 
    "totalTurnoverUSD":11111.456, 
    "children":[ 
     { 
     "totalTurnoverUSD":11100.456, 
     "children":[ 
      { 
       "totalTurnoverUSD":11.00, 
       "children":[ 

       ] 
      } 
     ] 
     } 
    ] 
} 

また、以下の設定ファイルを使用してelasticSearchとstdoutに出力します。

input { 
    file { 
     type => $type 
     path => $filePathofJsonFile 
     codec => "json" 
     start_position => "beginning" 
     sincedb_path => "/dev/null" 
     ignore_older => 0 
     close_older => 2 
     max_open_files => 10 
    } 
} 
filter { 
    mutate { 
     convert => { "totalTurnoverUSD" => "string" } 
    } 
} 

output { 
    elasticsearch{ 
     hosts => $elasticHost 
     index =>"123" 
    } 
    stdout { 
    codec => rubydebug 
    } 
} 

しかし、私はJSON入力ファイルのネストされた子文書にtotalTurnoverUSDフィールドを変換するわけではないため、エラーメッセージ

"error"=>{"type"=>"illegal_argument_exception", "reason"=>"mapper [children.totalTurnoverUSD] of different type, current_type [long], merged_type [double]"}}}, :level=>:warn} 

の下になって。

JSON文書のネストされたフィールドにアクセスして、そのデータ型を文字列に変換するための方法がありますか。

+0

入れ子にしたレベルはいくつありますか?それは常に3つですか?または3つの最大? – Val

+0

いいえ、必ずしも3つあるとは限りません。それはどのレベルまでも可能です。 – codiacTushki

答えて

1

これを解決する1つの方法は、LogstashにtotalTurnoverUSDの数値タイプを送信させてから、Elasticsearchでdynamic templateを使用させることです。あなたはこのようなあなたのインデックスを変更することができます

:これは達成するために起こっている

PUT my_index 
{ 
    "mappings": { 
    "my_type": { 
     "dynamic_templates": [ 
     { 
      "full_name": { 
      "path_match": "*.totalTurnoverUSD", 
      "mapping": { 
       "type":  "keyword" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

は、そのインデックスに任意のドキュメントのインデックスを作成するたびに、任意のフィールドは、文書内の任意のレベルでtotalTurnoverUSDの名前、種類を取得することですkeyword

インデックスを削除して最初から作成する必要がありますが、最初にインデックスを削除せずに試してみる必要があります。

UPDATE

すべてのあなたのインデックスにこれを適用する場合は、あなたがこのようなindex template作成することができます。その結果

PUT _template/all_indices 
{ 
    "template": "*", 
    "mappings": { 
    "_default_": { 
     "dynamic_templates": [ 
     { 
      "full_name": { 
      "path_match": "*.totalTurnoverUSD", 
      "mapping": { 
       "type":  "keyword" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

を、すべてのインデックス内のすべてのマッピングタイプを取得します動的テンプレートtotalTurnoverUSD

+0

はい。最初にすべてのインデックスを削除してから、インデックス作成作業の動的マッピングを再作成する必要があります。弾性検索ですべてのインデックスの動的マッピングを行う方法を知っていますか? – codiacTushki

+0

はい、 'my_type'の代わりに' _default_'を使用しますが、これをすべてのインデックスでPUTする必要があります。[index template](https://www.elastic.co/guide/en/elasticsearch /reference/current/indices-templates.html)各インデックスの作成時に適用されます – Val

+0

PUTワードの隣にあるmy_indexの値はどうですか? – codiacTushki

関連する問題