Json 如何删除Logstash Conf文件中地理坐标中的引号
我想用Kibana表示地图上的一条线,地图应该是Geojson结构。 我所拥有的数据是一组SQL表,然后我准备使用如下的Logstash将它们传输到弹性搜索Json 如何删除Logstash Conf文件中地理坐标中的引号,json,
elasticsearch,logstash,kibana,geojson,Json,
elasticsearch,Logstash,Kibana,Geojson,我想用Kibana表示地图上的一条线,地图应该是Geojson结构。 我所拥有的数据是一组SQL表,然后我准备使用如下的Logstash将它们传输到弹性搜索 input{ ... } filter{ if [lat] and [lon] { mutate{convert => ["lat", "float"]} mutate{convert => ["lon", "
input{ ... }
filter{
if [lat] and [lon] {
mutate{convert => ["lat", "float"]}
mutate{convert => ["lon", "float"]}
mutate{convert => ["for_lat", "float"]}
mutate{convert => ["for_lon", "float"]}
mutate{
add_field => {"[location-geotest][type]" => "multilinestring"}
add_field => {"[location-geotest][coordinates]" => [["%{lon}", "%{lat}"]]}
add_field => {"[location-geotest][coordinates]" => [["%{for_lon}", "%{for_lat}"]]}
}
}
}
但是,logstash conf文件未能索引Elasticsearch上的数据
{
:status=>400,
:action=>["index", {:_id=>"18022", :_index=>"geo_shape_test", :routing=>nil, :_type=>"_doc"}, #<LogStash::Event:0x687994b9>],
:response=> {
"index"=>{
"_index"=>"geo_shape_test",
"_type"=>"_doc",
"_id"=>"18022",
"status"=>400,
"error"=>{
"type"=>"mapper_parsing_exception",
"reason"=>"failed to parse field [location-geotest] of type [geo_shape]",
"caused_by"=>{"type"=>"x_content_parse_exception",
"reason"=>"[1:164] [geojson] failed to parse field [coordinates]",
"caused_by"=>{
"type"=>"parse_exception",
"reason"=>"geo coordinates must be numbers"
}
}
}
}
}
}
我认为问题是
"coordinates" => [
[0] "[\"126.99598717854032\", \"37.567179953757886\"]",
[1] "[\"126.99598717854032\", \"37.567179953757886\"]"
],
如果我换一个零件,它将是
"coordinates" => [
[0] [126.99598717854032, 37.567179953757886],
[1] [126.99598717854032, 37.567179953757886]
],
但我找不到解决方法。我想问题是,正如你所说,坐标必须是浮点而不是字符串。显然,mutate函数将值转换回字符串。如中所述 他们建议使用ruby脚本来代替。 这已针对线字符串as完成 从提供的数据来看,我不明白为什么需要多行字符串?只要有两个点,就足以存储为行字符串 我试过了
filter{
if [lat] and [lon] {
mutate{
convert => ["lat", "float"]
convert => ["lon", "float"]
convert => ["for_lat", "float"]
convert => ["for_lon", "float"]
add_field => {"[location-geotest][type]" => "linestring"}
}
ruby{
code => "event.set('[location-geotest][coordinates]', [[event.get('lon'), event.get('lat')], [event.get('for_lon'), event.get('for_lat')]])"
}
}
}
并得到结果:
"location-geotest" => {
"type" => "linestring",
"coordinates" => [
[0] [
[0] 126.99598717854032,
[1] 37.567179953757886
],
[1] [
[0] 126.99598717854032,
[1] 37.567179953757886
]
]
}
索引正确
如果您需要多个字符串,我想您需要更多的数据,并在ruby脚本中再添加一层数组
"location-geotest" => {
"type" => "linestring",
"coordinates" => [
[0] [
[0] 126.99598717854032,
[1] 37.567179953757886
],
[1] [
[0] 126.99598717854032,
[1] 37.567179953757886
]
]
}