Introducción

Couchbase Búsqueda de texto completo (FTS) es una gran herramienta para indexar y consultar datos geoespaciales. En este artículo, presentaré un caso de uso de búsqueda geoespacial y demostraré las distintas formas en que podemos realizar una búsqueda de datos de localización utilizando el servicio Couchbase Full Text Search. Utilizaré Couchbase Server Enterprise Edition 6.6 (ejecutando localmente en Docker) para crear un índice FTS en mi conjunto de datos geoespaciales de muestra y, a continuación, ejecutar consultas geoespaciales contra el índice.

Lo que hace interesante este caso es que no estamos utilizando una base de datos espacial. ¿Qué es una base de datos espacial? A diferencia de Couchbase Server, que es una base de datos de documentos NoSQL, las bases de datos espaciales están especialmente optimizadas para datos que describen espacios geométricos como líneas, puntos de interés, o incluso topología 3D en instancias avanzadas. Como veremos, las capacidades de búsqueda de texto completo de Couchbase lo hacen tan útil para manejar y consultar datos geoespaciales como cualquier cosa que podamos esperar de una solución más especializada.

Caso práctico

Mi familia siempre ha disfrutado visitando y explorando Parque Nacional de las Montañas Humeantes (o GRSM, la abreviatura del Servicio de Parques Nacionales), y algún día podríamos estar interesados en trasladarnos allí. Pero no se puede vivir en el parque nacional, así que tenemos que considerar las distintas ciudades y pueblos cercanos al parque y hacer una pequeña lista de los que evaluar y posiblemente visitar. 

El objetivo principal es estar cerca del parque nacional, pero también tendremos en cuenta otros factores como el tamaño (población) de las ciudades.

Conjunto de datos de muestra

Para apoyar mi caso de uso de GRSM, he decidido utilizar un conjunto de datos públicos de GeoNames que incluye estados, ciudades, pueblos y otros lugares emblemáticos de varias naciones del mundo. He descargado su Fichero de datos de Estados Unidos e importado en Couchbase sólo los datos de "lugares poblados" (registros con códigos de características de 'PPL', 'PPLA', 'PPLA2', 'PPLA3′,'PPLA4', y 'PPLC') para ciudades/pueblos con una población distinta de cero. El resultado es un bucket Couchbase "ciudades" con 30.734 documentos.  

El modelo de datos de documento de cada ciudad incluye algunos atributos de interés para mi caso de uso de GRSM: el nombre, el estado, la población, la elevación y, lo que es más importante, la latitud y la longitud. He aquí un par de ejemplos de documentos JSON:

ciudad::4699066

 

ciudad::4649251

Creación del índice

Con los datos de la ciudad cargados en el bucket de ciudades en Couchbase, podemos construir un índice FTS que se adapte al caso de uso de "vivir cerca de GRSM". Voy a cubrir brevemente los aspectos más destacados de la creación del índice requerido aquí, y la definición completa del índice está por debajo en el apéndice del post. (Para una explicación más detallada de la creación de índices FTS, consulte la entrada de mi blog sobre el tema.)

Creación de índices puntos clave: 

  • Nombre: city_geo
  • Cubo: ciudades
  • Escriba identificador: "Doc ID hasta separador" e introduzca "::" como delimitador (fíjese en las claves de los documentos de muestra anteriores)
  • Asignaciones de tipos: 
    • Desmarque "por defecto"
    • Crear un mapeo para documentos de tipo "ciudad", indexando sólo estos campos especificados: 
      • nombre: utilizaré el analizador de palabras clave para este campo (porque queremos ordenar por nombre más adelante), y comprobaré índice, almacenar, _all, vectores de términos y docvalues para que, además de buscar por este campo, pueda probar el índice con destacados y ordenar por este campo. 
      • estado: Solo almacena este campo de texto para que podamos recuperarlo en los resultados de búsqueda. 
      • población: Establecer el tipo a número y comprobar índice, almacén y docvalues para poder ordenar los resultados en función de la población más adelante. 
      • elevación: Establezca el tipo en número y marque sólo almacenar para que este valor se incluya en los resultados de la búsqueda.
      • geo: Establece el tipo a geopunto (ya que cada documento tiene las propiedades "lat" y lon" en el subdocumento "geo"), y comprueba index, store y _all. 

create the city_geo search index

Esperaremos hasta que el proceso de indexación esté 100% completo:

index processing complete

Ahora, vamos a probar rápidamente el índice en la interfaz de usuario de Couchbase para verificar que el índice está funcionando como se esperaba. ¡El resultado parece bueno!

testing the city_geo index

Búsquedas geoespaciales

Ahora que el conjunto de datos está cargado e indexado, puedo entrar en materia y ejecutar algunas consultas geoespaciales sobre el índice. A modo de demostración, consultaré el índice API REST del servicio de búsqueda Couchbase con cURLpero las consultas de búsqueda también pueden ejecutarse a través de cualquiera de los botones SDK de Couchbase como parte de su aplicación o servicio. Las consultas N1QL también admiten Búsqueda de texto completo con métodos SQL sin necesidad de codificación. 

Daré formato a la respuesta de la API REST para facilitar la lectura utilizando jqun procesador JSON de línea de comandos de código abierto.

Método de búsqueda 1: Punto y radio

A menudo queremos saber qué hay cerca o a una distancia determinada de un punto concreto. En mi caso de uso, me gustaría saber qué ciudades y pueblos están cerca del parque nacional de la GRSM... quizá en un radio de 80 kilómetros como punto de partida. Este primer método de búsqueda geoespacial se denomina "punto y radio", "punto y distancia" o "basado en el radio".  

Para mi "punto", he elegido Brecha recién descubiertaque es un paso sobre las Montañas Humeantes en la frontera de Tennessee y Carolina del Norte, así como un popular mirador y un punto de partida para el Sendero de los Apalaches. Es una visita obligada para mi familia cuando visitamos GRSM. Busquemos pueblos/ciudades en un radio de 80 km de Newfound Gap. 

area for point and radius geospatial search

Aquí está la consulta basada en el radio: 

 

El resultado es 79 ciudades, ordenadas por la distancia desde Newfound Gap. He incluido los 15 primeros resultados aquí: 

Método de búsqueda 2: Bounding Box

79 son muchos pueblos y ciudades a tener en cuenta, así que pensemos en otra forma de verlo. De mis visitas al parque nacional a lo largo de los años, sé a grandes rasgos que quiero vivir en algún lugar entre Knoxville (TN) y Waynesville (NC). Dadas esas dos ubicaciones, puedo consultar mi conjunto de datos GeoNames utilizando el método de búsqueda geoespacial "bounding box" o "basado en rectángulos".  

Puedo proporcionar las coordenadas de lugares cercanos a Knoxville y Wanyesville como parámetros de mi búsqueda y éstas se utilizarán como las esquinas superior izquierda e inferior derecha de un rectángulo. La consulta devolverá todas las ciudades situadas dentro de ese rectángulo.  

selected area for bounding box geospatial search

Esta es la consulta basada en rectángulos: 

 

El resultado son 21 ciudades, ordenadas por nombre: 

Método de búsqueda 3: Polígono

Tras investigar un poco más, he decidido que preferiría vivir en el condado de Sevier, pero al sur de la interestatal 40 y al norte de los límites del parque nacional.  

selected area for polygon-based geospatial search

Para ello, necesitaré ejecutar una búsqueda basada en polígonos contra mi índice FTS. Este tercer método fue añadido recientemente en Couchbase Server 6.5.1. Las áreas para consultas de búsqueda geoespacial pueden ahora especificarse como polígonos, además de círculos y rectángulos. El polígono se expresa como una serie de coordenadas de latitud-longitud, cada una de las cuales determina la ubicación de una esquina del polígono.  

En el mapa anterior del condado de Sevier (la línea roja clara es el límite del condado), he superpuesto un polígono que corresponde aproximadamente a la zona que me interesa, y he capturado las coordenadas de los puntos del polígono. Utilizaré estas coordenadas para formar mi consulta geoespacial basada en polígonos:

 

El resultado es una lista muy manejable de 6 ciudades, ordenadas por población en orden ascendente: 

Resumen y próximos pasos

Con estos tres métodos de búsqueda, Couchbase ofrece una completa capacidad de búsqueda geoespacial para que la incluyas en tus aplicaciones. Te animo a que crees un índice con datos de geopuntos y ejecutes algunas consultas basadas en puntos geoespaciales o polígonos geoespaciales. Puedes hacerlo fácilmente con uno de nuestros Couchbase conjuntos de datos de muestraLa muestra de viajes, que tiene muchos datos basados en la ubicación, puede utilizarse con este fin.  

Vaya un paso más allá y visualice los datos JSON como salida en tiempo real a partir de la solicitud de búsqueda en la base de datos de documentos mediante plataformas tecnológicas geoespaciales basadas en web como Mapbox o ESRI. Se beneficiará de la gestión de datos en un sistema de gestión de bases de datos distribuidas que también admite el escalado horizontal, el almacenamiento general de valores clave, la coherencia de datos y mucho más.

La búsqueda geoespacial es sólo una de las capacidades de la búsqueda de texto completo en Couchbase. También puede probar consultas sobre matrices y consultas en lenguaje natural con scoring, faceting y boosting. Para obtener más información sobre este tema, consulte la documentación para desarrolladores de aplicaciones y los enlaces de formación en la sección de referencias.  

Referencias

 

Anexo

Comando cURL de creación de índices y definición JSON:

 

Autor

Publicado por Brian Kane, Ingeniero de soluciones, Couchbase

Brian Kane es Ingeniero de Soluciones en Couchbase y lleva trabajando en el desarrollo de aplicaciones y con tecnologías de bases de datos desde 1996. Reside en el área de Houston, Texas.

1 Comentarios

  1. Hola Brian, gran explicación. Sin ningún conocimiento previo sobre couchbase FTS pude empezar con las consultas geoespaciales siguiendo tu post.

    Aún me queda una duda... ¿Hay alguna forma de recuperar la distancia real cuando se utiliza la consulta Punto y radio? ¿O tengo que implementar la fórmula haversine mí mismo?

Dejar una respuesta