I cannot help feeling there should be a way to do this in the mapping. You might want to ask in the elasticsearch forum if something like this would work.
"dynamic_templates": [
{
"everythingstring": {
"match" : "jsondoc*",
"mapping" : { "type" : "text", "norms" : false }
}
]
But if you really want to do it in logstash it would require a ruby filter
ruby {
code => '
def toString(object, name, event)
#puts "toString called for #{name}"
if object
if object.kind_of?(Hash) and object != {}
object.each { |k, v| toString(v, "#{name}[#{k}]", event) }
elsif object.kind_of?(Array) and object != []
object.each_index { |i|
toString(object[i], "#{name}[#{i}]", event)
}
else
event.set(name, object.to_s)
end
end
end
event.to_hash.each { |k, v|
unless k == "@timestamp"
toString(v, "[#{k}]", event)
end
}
'
}