En aquest tema, explorarem com Elasticsearch gestiona i realitza cerques geoespacials. La geo-cerca és una funcionalitat poderosa que permet indexar i cercar dades basades en ubicacions geogràfiques. Aquest tipus de cerca és especialment útil en aplicacions que necessiten treballar amb dades de localització, com ara aplicacions de mapes, serveis de lliurament, i aplicacions de xarxes socials.

Conceptes Clau

Abans de començar amb els exemples pràctics, és important entendre alguns conceptes clau relacionats amb la geo-cerca en Elasticsearch:

  • Geo-point: Un tipus de camp que emmagatzema coordenades geogràfiques (latitud i longitud).
  • Geo-shape: Un tipus de camp que emmagatzema formes geogràfiques més complexes, com ara polígons i línies.
  • Geo-distance: Una consulta que permet cercar documents dins d'una certa distància d'un punt geogràfic.
  • Geo-bounding box: Una consulta que permet cercar documents dins d'una caixa delimitadora geogràfica.
  • Geo-polygon: Una consulta que permet cercar documents dins d'un polígon geogràfic.

Indexant Dades Geoespacials

Creació d'un Índex amb un Camp Geo-point

Per començar, crearem un índex amb un camp location de tipus geo_point.

PUT /places
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

Indexant Documents amb Coordenades Geogràfiques

Ara, indexarem alguns documents amb coordenades geogràfiques.

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

POST /places/_doc/2
{
  "name": "Eiffel Tower",
  "location": {
    "lat": 48.858844,
    "lon": 2.294351
  }
}

Realitzant Cerques Geoespacials

Consulta Geo-distance

Aquesta consulta retorna documents dins d'una certa distància d'un punt geogràfic.

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

Consulta Geo-bounding Box

Aquesta consulta retorna documents dins d'una caixa delimitadora geogràfica.

GET /places/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 40.915255,
              "lon": -74.25909
            },
            "bottom_right": {
              "lat": 40.496044,
              "lon": -73.700272
            }
          }
        }
      }
    }
  }
}

Consulta Geo-polygon

Aquesta consulta retorna documents dins d'un polígon geogràfic.

GET /places/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_polygon": {
          "location": {
            "points": [
              { "lat": 40.915255, "lon": -74.25909 },
              { "lat": 40.496044, "lon": -74.25909 },
              { "lat": 40.496044, "lon": -73.700272 },
              { "lat": 40.915255, "lon": -73.700272 }
            ]
          }
        }
      }
    }
  }
}

Exercicis Pràctics

Exercici 1: Crear un Índex amb Geo-shape

  1. Crea un índex anomenat regions amb un camp boundary de tipus geo_shape.
  2. Indexa un document que representi una regió amb un polígon geogràfic.

Solució

PUT /regions
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "boundary": {
        "type": "geo_shape"
      }
    }
  }
}

POST /regions/_doc/1
{
  "name": "Region A",
  "boundary": {
    "type": "polygon",
    "coordinates": [
      [
        [-73.972, 40.764],
        [-73.981, 40.764],
        [-73.981, 40.773],
        [-73.972, 40.773],
        [-73.972, 40.764]
      ]
    ]
  }
}

Exercici 2: Realitzar una Consulta Geo-shape

  1. Realitza una consulta per trobar documents dins d'un polígon geogràfic específic.

Solució

GET /regions/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_shape": {
          "boundary": {
            "shape": {
              "type": "polygon",
              "coordinates": [
                [
                  [-73.972, 40.764],
                  [-73.981, 40.764],
                  [-73.981, 40.773],
                  [-73.972, 40.773],
                  [-73.972, 40.764]
                ]
              ]
            },
            "relation": "within"
          }
        }
      }
    }
  }
}

Resum

En aquest tema, hem après com Elasticsearch gestiona i realitza cerques geoespacials. Hem vist com crear índexs amb camps geo_point i geo_shape, com indexar documents amb coordenades geogràfiques, i com realitzar diverses consultes geoespacials. Aquestes habilitats són essencials per treballar amb dades de localització en Elasticsearch.

En el proper tema, explorarem com crear i utilitzar plugins personalitzats a Elasticsearch.

© Copyright 2024. Tots els drets reservats