elasticsearch,logstash,kibana,geojson,Json,elasticsearch,Logstash,Kibana,Geojson" /> elasticsearch,logstash,kibana,geojson,Json,elasticsearch,Logstash,Kibana,Geojson" />

Json 如何删除Logstash Conf文件中地理坐标中的引号

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", "

我想用Kibana表示地图上的一条线,地图应该是Geojson结构。 我所拥有的数据是一组SQL表,然后我准备使用如下的Logstash将它们传输到弹性搜索

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
                     ]
           ]
         }