如何在logstash配置文件中使用Mutate / Convert来获取Json文件

时间:2016-12-27 07:35:41

标签: elasticsearch logstash mutate

我有以下JSON作为logstash的输入。

{  
   "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 
    } 
}

但是低于错误信息

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

因为我没有在JSON输入文件的嵌套子文档中转换totalTurnoverUSD字段。

那么,有没有办法可以访问JSON文档中的嵌套字段来改变它们,以便将它们的数据类型转换为String。

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是让Logstash发送它出现的totalTurnoverUSD的任何数值类型,然后在Elasticsearch中使用dynamic template

您可以像这样修改索引:

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

这将实现的是,无论何时将任何文档索引到该索引中,文档中任何级别的任何名为totalTurnoverUSD的字段都将获得类型keyword

您可能需要先删除索引并从头开始重新创建索引,但请先试用它而不先删除它。

更新

如果要将其应用于所有索引,可以像这样创建index template

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

因此,所有索引中的所有映射类型都将获得totalTurnoverUSD

的动态模板