La búsqueda geoespacial en Elasticsearch permite realizar consultas basadas en la ubicación geográfica de los datos. Este tipo de búsqueda es esencial para aplicaciones que necesitan manejar datos espaciales, como servicios de mapas, aplicaciones de entrega, y análisis de datos geográficos.

Conceptos Clave

Antes de profundizar en la búsqueda geoespacial, es importante entender algunos conceptos clave:

  • Coordenadas Geográficas: Representan una ubicación en la Tierra usando latitud y longitud.
  • Tipos de Datos Geoespaciales: Elasticsearch soporta varios tipos de datos geoespaciales, como geo_point y geo_shape.
  • Consultas Geoespaciales: Permiten buscar documentos basados en su ubicación geográfica.

Tipos de Datos Geoespaciales

geo_point

El tipo geo_point se utiliza para representar una ubicación geográfica mediante una latitud y una longitud.

PUT /my_index
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

geo_shape

El tipo geo_shape se utiliza para representar formas geográficas complejas, como polígonos, líneas y círculos.

PUT /my_index
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

Indexando Datos Geoespaciales

Ejemplo con geo_point

POST /my_index/_doc/1
{
  "name": "Central Park",
  "location": {
    "lat": 40.785091,
    "lon": -73.968285
  }
}

Ejemplo con geo_shape

POST /my_index/_doc/2
{
  "name": "Manhattan",
  "location": {
    "type": "polygon",
    "coordinates": [
      [
        [-73.981, 40.768],
        [-73.981, 40.774],
        [-73.973, 40.774],
        [-73.973, 40.768],
        [-73.981, 40.768]
      ]
    ]
  }
}

Consultas Geoespaciales

Consulta de Distancia

Busca documentos dentro de una distancia específica de un punto.

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "2km",
          "location": {
            "lat": 40.785091,
            "lon": -73.968285
          }
        }
      }
    }
  }
}

Consulta de Bounding Box

Busca documentos dentro de un rectángulo definido por dos puntos.

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 40.774,
              "lon": -73.981
            },
            "bottom_right": {
              "lat": 40.768,
              "lon": -73.973
            }
          }
        }
      }
    }
  }
}

Consulta de Polígono

Busca documentos dentro de un polígono definido por una serie de puntos.

GET /my_index/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_polygon": {
          "location": {
            "points": [
              { "lat": 40.774, "lon": -73.981 },
              { "lat": 40.774, "lon": -73.973 },
              { "lat": 40.768, "lon": -73.973 },
              { "lat": 40.768, "lon": -73.981 }
            ]
          }
        }
      }
    }
  }
}

Ejercicios Prácticos

Ejercicio 1: Indexar y Buscar por Distancia

  1. Indexar un documento con una ubicación geográfica:

    POST /places/_doc/1
    {
      "name": "Statue of Liberty",
      "location": {
        "lat": 40.689247,
        "lon": -74.044502
      }
    }
    
  2. Buscar lugares dentro de 5 km de la Estatua de la Libertad:

    GET /places/_search
    {
      "query": {
        "bool": {
          "filter": {
            "geo_distance": {
              "distance": "5km",
              "location": {
                "lat": 40.689247,
                "lon": -74.044502
              }
            }
          }
        }
      }
    }
    

Ejercicio 2: Indexar y Buscar por Polígono

  1. Indexar un documento con una forma geográfica:

    POST /places/_doc/2
    {
      "name": "Central Park",
      "location": {
        "type": "polygon",
        "coordinates": [
          [
            [-73.981, 40.768],
            [-73.981, 40.774],
            [-73.973, 40.774],
            [-73.973, 40.768],
            [-73.981, 40.768]
          ]
        ]
      }
    }
    
  2. Buscar lugares dentro del polígono de Central Park:

    GET /places/_search
    {
      "query": {
        "bool": {
          "filter": {
            "geo_polygon": {
              "location": {
                "points": [
                  { "lat": 40.774, "lon": -73.981 },
                  { "lat": 40.774, "lon": -73.973 },
                  { "lat": 40.768, "lon": -73.973 },
                  { "lat": 40.768, "lon": -73.981 }
                ]
              }
            }
          }
        }
      }
    }
    

Resumen

En esta sección, hemos cubierto los conceptos básicos de la búsqueda geoespacial en Elasticsearch, incluyendo los tipos de datos geoespaciales (geo_point y geo_shape), cómo indexar datos geoespaciales y cómo realizar consultas geoespaciales. Estas habilidades son esenciales para trabajar con datos geográficos y pueden ser aplicadas en una variedad de aplicaciones del mundo real.

En el siguiente módulo, exploraremos temas avanzados como la creación de plugins personalizados y el uso de aprendizaje automático en Elasticsearch.

© Copyright 2024. Todos los derechos reservados