Elasticsearch - Como utilizar la geolocalización

En este ejemplo, vamos a entender cómo utilizar la geolocalización de ElasticSearch. Agregaremos documentos con geolocalización utilizando _geopoint y buscaremos luego esos documentos mediante coordenadas.

La geolocalización de ElasticSearch es una herramienta muy útil que puede servirte por ejemplo para buscar comercios, clientes, etc, que están cerca de dónde se encuentra un usuario en un punto específico.

Cuales son los pasos para crear un indice con geolocalización

  • Creas un indice con un POST y la propiedad properties:location
  • Creas un documento con un POST completando la propiedad location
  • Realizas la busqueda con un GET con un filtro de distance y location

Como crear el índice de geolocalización en Elasticsearch

Lo primero que necesitas es crear un índice en ElasticSearch con geolocalización.
El índice se llamará establishment y lo vas a definir con la propiedad _geopoint a fin de que tenga el soporte de geolocalización.

Definir el PUT para crear un índice con geolocalización y ejecutarlo. Observa el type _geopoint que está definido dentro de properties:location

curl --location --request PUT 'http://localhost:9200/establishment' \
--header 'Content-Type: application/json' \
--data-raw '{
    "mappings": {
        "properties": {
            "location": {
                "type": "geo_point"
            }
        }
    }
}

Elastic search Geo point

Como agregar documentos a elastic con geolocalización

En el índice establishment, creamos un documento con ID 1 e indicamos su localización.
Haciendo un PUT al index agregas un documento con las coordenadas de geolocalización.
Observa aquí, que dentro de location indican las coordenadas en latitud y longitud que tiene ese índice.

curl --location --request PUT 'http://localhost:9200/establishment/_doc/1' \
--header 'Content-Type: application/json' \
--data-raw '{
    "text": "Sports Shop ABC",
    "location": {
        "lat": -31.397561,
        "lon": -64.235415
    }
}'

Aquí solo te muestro una sola inserción para simplificar, pero es conveniente que insertes varios documentos en distintas coordenadas (cerca y lejos de un punto) para visualizar mejor este ejemplo.

Elastic search Geo point

Buscar documentos en elasticsearch con coordenadas de geolocalización

Luego puedes realizar búsquedas por cercanía utilizando kilómetros desde un punto de origen.

Observa nuevamente los filtros que usamos para la búsqueda por _geodistance .
Utilizando la distancia hasta donde deseamos buscar en distance y el punto desde el cual deseamos realizar la búsqueda en location .

curl --location --request GET 'http://localhost:9200/establishment/_search' \
--header 'Content-Type: application/json' \
--data-raw '{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "10km",
                    "location" : {
                        "lat" : -31.397948,
                        "lon" : -64.254007
                    }
                }
            }
        }
    }
}'

Elastic search Geo point

Conclusión

En este breve ejemplo vimos cómo crear un documento que contenga coordenadas de geolocalización. Utilizamos para ello la propiedad _geopoint para crear un documento y luego buscarlo por cercanía.

Existen otros tipos de busquedas que puedes examinar tambien, como la geo_shape que pueden proveerte otras formas de búsqueda por geolocalización.

Referencias:

Índices con geo_point: Datatype geo-point

Búsqueda por geo-distance utilizando la query _geopoint: Search geo-point