files - Los geodatos de CSV en elasticsearch como un tipo de punto de geo usando logstash
logstash elasticsearch (1)
El problema es que en su resultado de base_map_simple
usted nombró el índice base_map_simple
mientras que en su plantilla la propiedad de la template
es base_map_template
, por lo tanto, la plantilla no se aplica al crear el nuevo índice. La propiedad de la template
debe coincidir de alguna manera con el nombre del índice que se está creando para que la plantilla se active.
Funcionará si simplemente cambia el último a base_map_*
, es decir, como en:
{
"template": "base_map_*", <--- change this
"order": 1,
"settings": {
"index.number_of_shards": 1
},
"mappings": {
"node_points": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
ACTUALIZAR
Asegúrese de eliminar primero el índice actual y la plantilla., Es decir,
curl -XDELETE localhost:9200/base_map_simple
curl -XDELETE localhost:9200/_template/logstash
A continuación se muestra un ejemplo reproducible del problema que estoy teniendo con la mayoría de las versiones recientes de logstash y elasticsearch.
Estoy usando logstash para ingresar datos geoespaciales de un csv en elasticsearch como geo_points.
El CSV tiene el siguiente aspecto:
$ head simple_base_map.csv
"lon","lat"
-1.7841,50.7408
-1.7841,50.7408
-1.78411,50.7408
-1.78412,50.7408
-1.78413,50.7408
-1.78414,50.7408
-1.78415,50.7408
-1.78416,50.7408
-1.78416,50.7408
He creado una plantilla de mapeo que se parece a la siguiente:
$ cat simple_base_map_template.json
{
"template": "base_map_template",
"order": 1,
"settings": {
"number_of_shards": 1
},
"mappings": {
"node_points" : {
"properties" : {
"location" : { "type" : "geo_point" }
}
}
}
}
y tiene un archivo de configuración de logstash que se parece a lo siguiente:
$ cat simple_base_map.conf
input {
stdin {}
}
filter {
csv {
columns => [
"lon", "lat"
]
}
if [lon] == "lon" {
drop { }
} else {
mutate {
remove_field => [ "message", "host", "@timestamp", "@version" ]
}
mutate {
convert => { "lon" => "float" }
convert => { "lat" => "float" }
}
mutate {
rename => {
"lon" => "[location][lon]"
"lat" => "[location][lat]"
}
}
}
}
output {
stdout { codec => dots }
elasticsearch {
index => "base_map_simple"
template => "simple_base_map_template.json"
document_type => "node_points"
}
}
Luego ejecuto lo siguiente:
$cat simple_base_map.csv | logstash-2.1.3/bin/logstash -f simple_base_map.conf
Settings: Default filter workers: 16
Logstash startup completed
....................................................................................................Logstash shutdown completed
Sin embargo, al mirar el índice base_map_simple, sugiere que los documentos no tendrían una ubicación: tipo de punto de geo en él ... y más bien serían dos dobles de lat y lon.
$ curl -XGET ''localhost:9200/base_map_simple?pretty''
{
"base_map_simple" : {
"aliases" : { },
"mappings" : {
"node_points" : {
"properties" : {
"location" : {
"properties" : {
"lat" : {
"type" : "double"
},
"lon" : {
"type" : "double"
}
}
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1457355015883",
"uuid" : "luWGyfB3ToKTObSrbBbcbw",
"number_of_replicas" : "1",
"number_of_shards" : "5",
"version" : {
"created" : "2020099"
}
}
},
"warmers" : { }
}
}
¿Cómo necesitaría cambiar cualquiera de los archivos anteriores para asegurarme de que entra en la búsqueda elástica como tipo de punto geográfico?
Finalmente, me gustaría poder realizar una búsqueda de un vecino más cercano en los puntos geográficos usando un comando como el siguiente:
curl -XGET ''localhost:9200/base_map_simple/_search?pretty'' -d''
{
"size": 1,
"sort": {
"_geo_distance" : {
"location" : {
"lat" : 50,
"lon" : -1
},
"order" : "asc",
"unit": "m"
}
}
}''
Gracias