Solr: Búsqueda geolocalizadas

01/06/2016       Sergio Raposo       Código - Snippet, OpenCms 10, OpenCms 8, OpenCms 9, Programación

Una de las características que posee Solr y que podemos aprovechar en OpenCms son las búsquedas geolocalizadas, es decir, podemos implementar un buscador para localizar las tiendas más cercanas a una posición concreta, o los eventos más cercanos a nuestra ubicación.

Indexación de coordenadas

El primer paso que debemos dar es indexar la información necesaria para que Solr sea capaz de interpretarlo como una coordenada. Para ello debemos crear un campo en nuestro XML que sean las coordenadas en formato LatLon, es decir: latitud,longitud. Ej: Sevilla: 37.3918136,-5.9804856.

En nuestro XSD añadiremos lo siguiente:

<xsd:element name="Coordenadas" type="OpenCmsString" />
<searchsetting element="Coordenadas" searchcontent="true">
   <solrfield targetfield="CoordenadasTienda" sourcefield="*_loc"/>
</searchsetting>

Como vemos, en solr ya tenemos un tipo de campo específico para coordenadas: sourcefield="*_loc"

Filtro en buscador por geolocalización

Una vez que tenemos indexada la información podemos utilizar una serie de funciones predefinidas en solr para realizar nuestras búsquedas:

  • geofilt: filtro por distancia, de forma que podemos buscar todos los puntos que estén a menos de una distancia indicada en la query.
  • geodist: cálculo de la distancia entre puntos, lo que nos permite, por ejemplo, ordenar los resultados por los más cercanos en base al punto consultado
  • bbox: Filtro por distancia aproximada. Los cálculos de distancias pueden ser muy costoso en tiempo, lo que puede provocar que nuestras consultas sean más lentas. Usando bbox, usamos una aproximación en lugar de una distancias exactas, en algunos casos que no queremos resultados tan exactos es más recomendable esta opción.

Ejemplos de consultas:

String location = "37.3918136,-5.9804856";
//Devuelve las 3 tiendas más cercanas al punto indicado.
String filterLocation = "&sfield=CoordenadasTienda_es_loc&pt="+location+"&sort=geodist() asc&fl=*,_dist_:geodist()&rows=3";
//Los puntos dentro de un radio de 5km
String filterLocation = "&fq={!geofilt}&sfield=CoordenadasTienda_es_loc&pt="+location+"d=5";
//Filtro por distancia aproximada
String filterLocation = "&fq={!bbox}&sfield=CoordenadasTienda_es_loc&pt="+location+"d=5";

Utilidades para obtener una ubicación

Existen varias herramientas que podemos utilizar para obtener una ubicación:

  • HTML5 y su api de geolocalización para obtener la ubicación actual del dispositivo desde el que nos estamos conectando.
  • Google Maps API para obtener la localización de un lugar mediante un buscador por palabra, por ejemplo, un código postal, una ciudad, un hotel, un monumento, etc.
 Solr, Geolocalización, Localización, Coordenadas, Distancias