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
- Crea un índex anomenat regionsamb un campboundaryde tipusgeo_shape.
- 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
- 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.
Curs d'Elasticsearch
Mòdul 1: Introducció a Elasticsearch
- Què és Elasticsearch?
- Instal·lant Elasticsearch
- Conceptes Bàsics: Nodes, Clústers i Índexs
- Arquitectura d'Elasticsearch
Mòdul 2: Començant amb Elasticsearch
Mòdul 3: Tècniques Avançades de Cerca
Mòdul 4: Modelatge de Dades i Gestió d'Índexs
Mòdul 5: Rendiment i Escalabilitat
- Optimitzant el Rendiment de la Cerca
- Escalant Elasticsearch
- Monitorització i Manteniment
- Còpia de Seguretat i Restauració
Mòdul 6: Seguretat i Control d'Accés
- Assegurant Elasticsearch
- Autenticació i Autorització d'Usuaris
- Control d'Accés Basat en Rols
- Auditoria i Compliment
Mòdul 7: Integracions i Ecosistema
- Elasticsearch amb Logstash
- Elasticsearch amb Kibana
- Elasticsearch amb Beats
- Elasticsearch amb Altres Eines
