Problème pour convertir un float en geo_point

Bonjour,

J'ai un fichier csv que je souhaites traiter avec logstash avec des infos du type : numéro,adresse,coord x, coord y .
Pour la partie parsing dans logstash : aucun problème je récupère bien toutes mes infos. Suite à ça je créé un field location pour pouvoir avoir un field assimilable à un geo_point:

convert => {
	"x" => "float"
	"y" => "float"
}
add_field => {"location" => "%{x}"}
add_field => {"location" => "%{y}"}
convert => {
	"location" => "float"
}

Par la suite j'envoie mes données dans elastic avec le mapping suivant:

{
  "properties": {
    "Adresse": {
      "type": "keyword"
    },
    "Pays": {
      "type": "keyword"
    },
    "Type": {
      "type": "keyword"
    },
    "x": {
      "type": "long"
    },
    "y": {
      "type": "long"
    },
    "location": {
      "type": "geo_point"
    },
    "Code Postal": {
      "type": "keyword"
    },
    "Correspondant": {
      "type": "keyword"
    },
    "timestamp": {
      "type": "date"
    },
    "Ville": {
      "type": "keyword"
    }
  }
}

Pour les données contenant les field x et y ( certaines n'ont pas ces champs car pas d'infos pour cette personne) j'obtiens le message suivant:

[2020-02-12T08:19:18,201][WARN ][logstash.outputs.elasticsearch][main] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"squid-sadoc", :_type=>"_doc", :routing=>nil}, #<LogStash::Event:0x33fd37bd>], :response=>{"index"=>{"_index"=>"squid-sadoc", "_type"=>"_doc", "_id"=>"-stEOHABEl3EnDY7MDk_", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [location] of type [geo_point]", "caused_by"=>{"type"=>"parse_exception", "reason"=>"unsupported symbol [.] in geohash [1.4180062632087487]", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"unsupported symbol [.] in geohash [1.4180062632087487]"}}}}}}

Ce qui est intéressant ( si change le type du champ location en text pour ne pas avoir de soucis) , c'est qu'il n'y a pas le même problème pour les fields x et y ( ils sont bien enregistrés comme des nombre ).

Pour expliquer le contexte, les coordonnées dans le csv sont exprimées au format lambert donc avec un script python je les exprime au format wgs84 engendrant des float de cette taille : 1.4180062632087487 ( je le précise car je ne sais pas si cela peut être la cause )

Je vous remercie d'avance pour toute réponse apportée.

Je ne comprends pas trop le script logstash.

Mais voici un tuto que j'ai rédigé il y a longtemps qui permettait notamment à un moment de transformer longitude, et latitude en location.lon et location.lat ce qui est compatible avec un geo_point.

https://david.pilato.fr/blog/2018/03/22/enriching-your-postal-addresses-with-elastic-stack-part-1/

1 Like

Un geo-point est un type Objet avec les cles lat et lon. Donc si tu définis le variable location comme geo_point, il va falloir que tu définisses les valeurs des clés location.lat et location.lon.

Et pour cela, j'ai testé avec le filter suivant, ça a l'air de bien marcher.

input {
     stdin{}
}

filter {
  csv {
    separator => ","
    columns => [
        "x","y"
    ]
    remove_field => [ "message", "@version", "@timestamp", "host" ]
}

mutate {
    convert => { "x" => "float"}
    convert => { "y" => "float"}
    rename => {
        "x" => "[location][lon]"
        "y" => "[location][lat]"
    }
 }
}

En input :

23.747,3.4

En output :
{"location":{"lat":"3.234","lon":"23.743647"}}

2 Likes

Tu as raison, merci beaucoup !
Merci aussi dadoonet, je regarde ce tuto dès ce soir