2017-02-14 7 views
0

У меня есть вложенное поле с массивами в массиве в формате JSON, как следующее:Как обрабатывать JSON вложенный массив в Logstash

{ 
    "foo": { 
     "bar": [ 
      [ 
       "a", 
       "b" 
      ], 
      [ 
       "c", 
       "d" 
      ] 
     ] 
    } 
} 

Ниже мой конфигурационный файл:

input { 
    file { 
     codec => "json" 
     path => "pathtofile" 
     type => "footype" 
     start_position => "beginning" 
    } 
} 
filter { 
    json { 
     source => "message" 
     remove_field => [ "host", "message", "path" ] 
    } 
} 
output { 
    elasticsearch { 
     action => "index" 
     index => "bar" 
     hosts => [ "http://localhost:9200" ] 
    } 
} 

Я получил следующая ошибка:

09:40:47.725 [[main]>worker0] WARN logstash.outputs.elasticsearch - Failed action. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"bar", :_type=>"footype", :_routing=>nil}, 2017-02-13T01:40:30.387Z myconnection %{message}], :response=>{"index"=>{"_index"=>"bar", "_type"=>"footype", "_id"=>"AVo1IN0vK2jgwdCXqZ-q", "status"=>400, "error"=>{"type"=>"illegal_argument_exception", "reason"=>"mapper [foo.bar] of different type, current_type [long], merged_type [text]"}}}}

У меня возникло ощущение, что это проблема с массивом. Я провел некоторое исследование и знаю, что массив не поддерживается. Но мне нужно глотать массив в elasticsearch. Есть ли способ сделать это?

Любая помощь будет оценена по достоинству.

ответ

0

Я решил это, используя рубиновый фильтр:

ruby { 
     code => ' 
      j = 0 
      for i in event.get("[foo][bar]") do 
       #i is an array element in the big array 
       l = 0 
       for k in i do 
        event.set("item#" + j.to_s + "#" + l.to_s, k) 
        l = l + 1 
       end 
       j = j + 1 
      end 
     ' 
    } 

Это в конечном счете создавать поля

item#0#0 = "a" 
item#0#1 = "b" 
item#1#0 = "c" 
item#1#1 = "d" 
Смежные вопросы