我有以下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。
答案 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