Búsqueda de texto completo

Cómo realizar búsquedas geoespaciales basadas en polígonos en Couchbase

Características geoespaciales han demostrado a lo largo de los años que aumentan significativamente el compromiso de los usuarios. De hecho, nos hemos acostumbrado tanto a ello que ahora incluso esperamos que cualquier tipo de recomendación (noticias, restaurantes, productos) también se base en la ubicación. Hoy en día, la mayoría de las aplicaciones se basan principalmente en Radius. lo que, naturalmente, puede conducir a resultados imprecisos o subóptimos. En un mundo en el que las empresas compiten por la atención del usuario, la precisión puede ser un factor diferenciador clave, por eso la búsqueda basada en polígonos es cada vez más popular.

En este artículo, hablaremos de la búsqueda basada en polígonos en Couchbase, una característica que se ha añadido desde Couchbase 6.6

 

Qué es la búsqueda de polígonos geoespaciales

consulta geoespacial especifica un área y devuelve cada documento que contenga una referencia a una ubicación dentro del área. Las áreas y las ubicaciones se representan mediante latitudlongitud pares de coordenadas.

Hay muchos tipos de geoespaciales consulta, Basado en el radio Las consultas (también conocidas como distancias puntuales) son las más utilizadas y también las más sencillas para empezar. Todo lo que necesitas es una coordenada y el radio del círculo:

radius based search

 

En la búsqueda de recuadros delimitadores, debe especificar dos pares de coordenadas de latitud-longitud. Estas coordenadas indican respectivamente las esquinas superior izquierda e inferior derecha de un rectángulo. Los documentos se devuelven si hacen referencia a una ubicación dentro del área del rectángulo:

rectangle geospatial search with Couchbase NoSQL

Los dos métodos anteriores son excelentes cuando se necesitan resultados aproximados, pero no bastan cuando hay que limitar el área de búsqueda :

polygon search building

La búsqueda Geometría/Polígono geoespacial permite buscar documentos contenidos dentro de un objeto cerrado en forma de polígono definido por una secuencia de coordenadas. En la imagen anterior, por ejemplo, queremos limitar nuestra búsqueda únicamente a los documentos cuyas coordenadas se encuentren dentro del polígono que hemos definido, que en este caso representa un edificio.

Prácticamente no hay límite en el número de coordenadas/puntos que se pueden especificar en la consulta de polígonos, pero, como ocurre con cualquier otro motor de búsqueda, el rendimiento se reducirá naturalmente si hay que especificar polígonos muy complejos.

Caso de uso basado en polígonos geoespaciales

La búsqueda basada en polígonos (también denominada búsqueda geométrica) no se limita a las personas que analizan imágenes de satélite, sino que hay muchos casos de uso común que podrían beneficiarse de ella:

  • Real State: Buscar oficinas/viviendas en un pueblo determinado o en una zona específica
  • Juegos de azar: Aparición de objetos en zonas específicas (por ejemplo, diferentes tipos de pokemon que aparecen según el terreno en Pokemon Go).
  • Analítica: Cuántas personas han pasado por una región específica (por ejemplo, cuántos conductores de Uber/Lyft han estado en el aeropuerto en un día determinado)
  • Publicidad: Aumentar el CPC (coste por clic) cuando los usuarios se encuentran en un lugar específico (por ejemplo, un centro comercial). 
  • Ciudades inteligentes: Notificar a los ciudadanos de una región sobre una amenaza potencial (por ejemplo: granizada, inundaciones).

Crecimiento de la búsqueda geoespacial

Podemos demostrar indirectamente lo popular que se ha vuelto la búsqueda basada en la ubicación comparando el porcentaje de aplicaciones que solicitan permiso para acceder a la ubicación del usuario a lo largo de los años:

fuente: https://hotforsecurity.bitdefender.com/blog/1-2-percent-of-google-play-store-is-thief-ware-study-shows-7340.html

 

Según el gráfico anterior, en 2013 solo 11,68% de las aplicaciones móviles solicitaban acceso a la ubicación del usuario. Este otro informe sugiere que en 2014, casi 24% de las aplicaciones solicitaban la ubicación del usuario:

mobile_app_permissions_2014

fuente: https://www.statista.com/statistics/486440/leading-google-play-app-permissions/

Si avanzamos rápido hasta 2020, este tercer informe ya sugiere que 95% de las apps en China solicitan acceso a la ubicación del usuario:

permissions_mobile_app_2020

fuente: https://www.statista.com/statistics/1111353/china-most-common-mobile-social-app-permissions-by-category/

 

Creación de índices geoespaciales 

Para esta demostración, necesitará este pequeño conjunto de datos de terremotos en EE.UU.. Puedes cargarlo rápidamente en Couchbase creando un bucket llamado  terremotosy, a continuación, haga clic en Documentos -> Importar documentosseleccione el archivo earthquake.json y, a continuación, haga clic en Importar datos:

importa dateset into couch

Ahora vamos a crear nuestro índice geo FTS. En primer lugar, vaya a la pestaña Buscar y haga clic en "Añadir índice". A continuación, especifique la siguiente configuración:

    • Nombre: terremoto_idx
    • Cubo: terremoto
    • Asignaciones de tipos:
      • Desmarcar por defecto
      • Añade una nueva asignación de tipos denominada terremoto
        • Insertar un campo hijo: 
          • Campo: geo
          • Tipo: geopunto
          • Se puede buscar como: geo

index creation

Una vez que el Progreso del Índice alcanza 100% estamos listos para hacer nuestra primera búsqueda de polígonos.

 

Polígono / Búsqueda geométrica en acción

La búsqueda tiene dos requisitos principales: Los campos con coordenadas deben indexarse mediante la función geopuntos (como hicimos en la sesión anterior), y las coordenadas deben formar un polígono cerrado, lo que significa que la primera y la última coordenada deben ser iguales. He aquí un ejemplo de polígono válido:

Si trazamos estas coordenadas en un mapa, esto es lo que obtendremos:

map coordinates

Fuente: https://www.keene.edu/campus/maps/tool/

 

Formatos de coordenadas admitidos

Se aceptan los siguientes formatos para las coordenadas de polígonos:

  • Matriz única: [ "lat, lon", "lat, lon", "lat, lon", ...]
  • Múltiples matrices: [ [ lon, lat], [ lon, lat], ... ]
  • GeoJson: [ { "lat": 1, "lon": 1}, { "lat": 1, "lon": 1}, ... ]
  • Geohash: [ "9q8zjbkp", "9q8yvvdh", "9q8yyp1e" ]

Búsqueda geoespacial mediante la API REST

Además de utilizar los SDK nativos, también puede utilizar la API REST de búsqueda de texto completo para realizar consultas geoespaciales utilizando el siguiente formato:

He aquí un ejemplo real utilizando nuestro conjunto de datos e índice:

y aquí está la salida del comando anterior:

Tenga en cuenta que debe especificar las coordenadas mediante el atributo puntos_polígono. También puede ampliar esta consulta para filtrar por otros atributos del documento (por ejemplo: Región, Magnitud, etc.)

 

Anillo geoespacial / Búsqueda en forma de donut 

También puede especificar uno o más agujeros en su polígono en caso de que desee filtrar algunas áreas específicas:

hole-polygon

Puedes conseguir algo como la imagen de arriba utilizando consultas booleanas:

 

En resumen, basta con especificar las coordenadas de los polígonos dentro del campo "debe" y sus agujeros en el bloque "no_debe“.

Le recomiendo encarecidamente que utilice siempre Disyunciones al especificar sus agujeros, aunque también podría utilizar un Conjunción si tiene un solo agujero, el uso de la conjunción para múltiples agujeros potencialmente no filtrará sus datos correctamente (a menos que tenga documentos con coordenadas dentro de ambos agujeros). Si usted no tiene idea de lo que estoy hablando, consulte esta documentación sobre consultas compuestas.

 

Otras lecturas

Si está interesado en la búsqueda geográfica, le recomiendo encarecidamente que lea el documento documentación oficial. Si no conoce la búsqueda de texto completo, consulte este enlace vídeo en el que se muestra cómo crear una búsqueda similar a la de Netflix utilizando FTS.

También tenemos una serie de artículos en el blog de Couchbase que hablan sobre aspectos importantes de la búsqueda de texto completo:

 

 

 

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Denis Rosa, Defensor del Desarrollador, Couchbase

Denis Rosa es un Developer Advocate para Couchbase y vive en Munich - Alemania. Tiene una sólida experiencia como ingeniero de software y habla con fluidez Java, Python, Scala y Javascript. A Denis le gusta escribir sobre búsqueda, Big Data, AI, Microservicios y todo lo que pueda ayudar a los desarrolladores a hacer una aplicación hermosa, más rápida, estable y escalable.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.