Geoespacial search es ahora totalmente compatible con Couchbase Server 5.5. Echa un vistazo a la Anuncio de Couchbase Server 5.5y descargar la versión para desarrolladores gratis ahora mismo.

En este post, voy a demostrar las capacidades geoespaciales de Couchbase Full Text Search mediante la creación de una interfaz de usuario basada en web que realiza búsquedas. Siempre que pienso en búsquedas geoespaciales, pienso en Yelp, que es genial para ayudarme a encontrar restaurantes en un área específica.

Así que voy a divertirme un poco y crear una versión muy básica de Yelp, pero sólo para hoteles. Lea también ¿Qué son los datos geoespaciales? si es nuevo para usted.

Puesta en marcha

Estos son los pasos que seguí para crear un nuevo proyecto antes de empezar a escribir código.

  1. En la línea de comandos: dotnet nueva aurelia. Esto supone que usted tiene .NET Core instalado. Tenga en cuenta que la búsqueda geoespacial no es una función exclusiva de .NET: puede utilizarla con la aplicación otros SDK de Couchbase como Node.js, Java, etc. También asume que has instalado un Plantilla SPA para Aurelia. También puede ir con Angular o React si lo desea, pero me gusta mucho Aureliay creo que deberías darle una oportunidad.
  2. El comando anterior creará un shell de un proyecto ASP.NET Core. En esta entrada de blog, no voy a usar Razor. Sólo voy a utilizar ASP.NET como backend para los puntos finales de la API REST.
  3. npm install aurelia-google-maps. No tiene por qué utilizarlo, pero el plugin aurelia-google-maps me facilitará la interacción con Google Maps en mi aplicación.
  4. Abrí este proyecto en Visual Studio 2017. He añadido Couchbase.Extensions.DependencyInjection con NuGet. No es necesario utilizar esta extensión, pero facilita las cosas.
  5. He instalado Couchbase Server 5.5, incluida la Servicio de búsqueda de texto completo. He configurado el cubo para muestras de viaje. I creado un usuario "mate" con acceso total a ese cubo.

Crear un índice geoespacial

Antes de construir el backend ASP.NET, necesitamos crear un índice geoespacial en Couchbase Server. Una vez que inicies sesión, haz clic en "Buscar" en el menú (está debajo de "Workbench"). Haz clic en "Añadir índice" para empezar.

Create Geospatial index

He llamado a mi índice "mygeoindex". Seleccioné muestra-viaje como el bucket a indexar.

En "Type Mappings", desmarco la opción por defecto. Añado una nueva correspondencia de tipos con el nombre "hotel". Cada documento de hotel en "muestra-viaje" tiene un tipo con el valor "hotel". Selecciono la casilla "indexar sólo los campos especificados".

Voy a añadir dos campos hijo. Uno es "geo", que contiene las coordenadas geoespaciales dentro de un documento de hotel. Asegúrate de seleccionar "geopunto" como tipo. El otro es "name", que será el nombre del hotel. He optado por "almacenar" cada uno de estos datos: el índice será más grande, pero puedo evitar una búsqueda secundaria si almaceno la información en el índice.

Nota importante: Existe un error (NCBC-1651) en la versión actual del SDK .NET que provocará un error si se intenta leer desde un campo geopunto. En los ejemplos de código, he creado una solución: En realidad, no obtengo los campos geo y name del índice de búsqueda. En su lugar, utilizo la clave del documento devuelta por la búsqueda para realizar una llamada "get" secundaria y obtener el documento completo. Ten en cuenta que ésta es una técnica que puedes considerar si quieres mantener bajo el tamaño de tu índice. Este error ya se ha corregido y se incluirá en una próxima versión. Este es el peligro de estar a la última.

Eso es todo. Haz clic en "Crear índice". Observa el "progreso de indexación" en la siguiente pantalla hasta que llegue a 100% (no debería tardar mucho, suponiendo que te hayas acordado de desmarcar "por defecto").

ASP.NET Core REST Endpoints

A continuación, vamos a pasar a ASP.NET. Crearé dos endpoints. Un endpoint demostrará el cuadro delimitador método de búsqueda, y el otro demostrará el distancia método de búsqueda.

Necesitaré un objeto bucket de Couchbase para ejecutar las consultas. Siga las instrucciones ejemplos en la entrada de mi blog sobre inyección de dependencia o consulta el código fuente en Github si nunca has hecho esto antes.

Cuadro delimitador

Una búsqueda en un "cuadro delimitador" significa que usted define un cuadro en un mapa y desea buscar puntos de interés que estén dentro de ese cuadro. Sólo necesita dos puntos para definir una caja: las coordenadas de la esquina superior derecha y las coordenadas de la esquina inferior izquierda. (Las coordenadas son latitud y longitud).

Para crear una consulta geoespacial de cuadro delimitador, utilice la función GeoBoundingBoxQuery disponible en el SDK de .NET. Voy a hacer esto dentro de un método POST con lo anterior BoxSearch como parámetro.

Todo lo que necesito devolver desde este endpoint es una lista de los resultados: las coordenadas de cada hotel y el nombre y ubicación del hotel. He creado un GeoSearchResult clase para esto.

He construido esta clase para que coincida con el plugin de Google Maps que utilizaré más adelante.

Finalmente, usaré esta clase para devolver algunos resultados desde el endpoint.

La búsqueda por "distancia" es otra forma de realizar consultas geoespaciales. Esta vez, en lugar de una caja, será más como un círculo. Usted proporciona una coordenada y una distancia. La distancia será el radio desde ese punto.

Lo pongo por defecto en millas, pero ciertamente puedes usar kilómetros en su lugar, o presentar la opción en la interfaz de usuario.

El punto final será muy similar al punto final del cuadro delimitador, salvo que utiliza GeoDistanceQuery.

En este punto, puedes empezar a probar estos endpoint con Postman o Fiddler si quieres. Pero será muy agradable ver esto en un mapa.

Auerlia y Google Maps

En Aurelia, he creado dos componentes: geosearchbox y geosearchpoint.

Auerlia components

Cada uno de ellos tendrá un componente de Google Maps con el que el usuario podrá interactuar. Estos mapas se centrarán en San Francisco, porque es donde se encuentran muchos de los hoteles de "muestra-viaje".

Componente de búsqueda Bounding Box

En google-map` tiene un map-click.delegate que se activará cuando el usuario haga clic en el mapa. En geosearchbox.html:

marcadores es simplemente una matriz que contiene las coordenadas de los resultados de búsqueda que deberían aparecer en el mapa. Inicialmente estará vacío.

Cuando el usuario haga clic por primera vez en el mapa, esto establecerá la primera coordenada (arriba a la izquierda) en el formulario. En geosearchbox.ts:

A continuación, haga clic en otro punto del mapa. Esto fijará la segunda coordenada (abajo a la derecha).

Mi implementación es muy básica. Nada de gráficos extravagantes ni validación de que la segunda coordenada está abajo a la derecha de la primera. Los campos de un formulario simplemente se rellenarán con la latitud y la longitud. En geosearchbox.html:

Una vez que haya seleccionado dos coordenadas, aparecerá un botón de búsqueda. Haga clic en él para enviar estas coordenadas al punto final creado anteriormente, y se activará la función searchClick() como se ve en geosearchbox.ts:

Cuando Aurelia, Google Maps, ASP.NET Core y Couchbase trabajan juntos, tiene este aspecto:

Geospatial bounding box

Búsqueda a distancia

La aplicación de la consulta geoespacial de "distancia" será similar a la de la interfaz de usuario de los recuadros delimitadores. Esta vez, sólo tendrá que hacer clic en un único punto del mapa. Pero tendrá que introducir una distancia (en millas).

En google-map tendrá un aspecto idéntico. El sitio clickMap es diferente:

Especifique una distancia (en millas) y, a continuación, haga clic en "buscar" para realizar una solicitud POST al punto final que escribimos anteriormente.

A continuación se muestra un clip de la búsqueda en movimiento. Observe cómo cambian los resultados a medida que muevo la coordenada.

Geospatial distance point search query

Resumen

Con la función indexación geoespacial toda la matemática y la búsqueda se delega a la Plataforma de Datos Couchbase. Así que puedes centrarte en crear una interfaz de usuario increíble (mejor que la mía) y una lógica de negocio sólida como una roca.

Asegúrese de consulte la documentación para obtener una visión completa de las capacidades geoespaciales de Couchbase. Lea esta entrada de blog para obtener más información sobre bases de datos espaciales.

Si necesita ayuda o tiene alguna pregunta, consulte la página Foros de Couchbase Servery si tiene alguna pregunta sobre el SDK .NET de Couchbase, consulte la sección Foros del SDK .NET.

Si quieres ponerte en contacto conmigo, deja un comentario o búscame en Twitter @mgroves.

Autor

Publicado por Matthew Groves

A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviará pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribió una aplicación de punto de venta en QuickBASIC para la pizzería de sus padres, allá por los años noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.

Dejar una respuesta