Mejora de la experiencia de búsqueda ordenando los resultados por distancia desde un punto de referencia determinado

Completado

A menudo, los usuarios quieren buscar elementos asociados a una ubicación geográfica. Por ejemplo, es posible que quieran encontrar la cafetería más cercana a su ubicación. Para ayudarle a comparar ubicaciones de la superficie terrestre, Búsqueda de AI incluye funciones geoespaciales a las que puede llamar en las consultas.

Aquí aprenderá a buscar elementos cercanos a un punto físico o dentro de un área delimitada.

¿Qué son las funciones geoespaciales?

En unidades anteriores de este módulo, vio cómo los usuarios pueden localizar un hotel especificando campos de búsqueda, como Description y Category:

search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true

Una consideración importante al reservar un hotel es su ubicación geográfica. Por ejemplo, si reserva un viaje para ver la Torre Eiffel, querrá un hotel situado cerca de él.

Para pedir a Búsqueda de AI que devuelva resultados basados en su información de ubicación, puede usar dos funciones en la consulta:

  • geo.distance. Esta función devuelve la distancia en una línea recta sobre la superficie terrestre desde el punto especificado para la ubicación del resultado de la búsqueda.
  • geo.intersects. Esta función devuelve true si la ubicación del resultado de una búsqueda está dentro de un polígono especificado.

Para usar estas funciones, asegúrese de que el índice incluye la ubicación para los resultados. Los campos de ubicación deben tener el tipo de datos Edm.GeographyPoint y almacenar la latitud y longitud.

Uso de la función geo.distance

geo.distance es una función que toma dos puntos como parámetros y devuelve la distancia entre ellos en kilómetros.

Supongamos que está buscando un hotel cerca de la Torre Eiffel. Puede modificar la consulta anterior y agregar un nuevo filtro:

search=(Description:luxury OR Category:luxury)$filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5&$select=HotelId, HotelName, Category, Tags, Description&$count=true

Esta consulta devuelve todos los hoteles de lujo en el índice dentro de un radio de cinco kilómetros de la Torre Eiffel. En la consulta:

  • Location es el nombre del campo que almacena la ubicación del hotel.
  • geography'POINT(2.294481 48.858370)' es la ubicación de la Torre Eiffel como longitud y latitud.
  • le 5 especifica que los hoteles deben incluirse en los resultados si la función geo.distance devuelve un número menor o igual que cinco kilómetros.

Importante

Cuando se usa geo.distance en un filtro, no se admiten los operadores igual a (eq) ni no igual a (ne). En su lugar, use lt, le, gt o ge.

Dado que geo.distance devuelve la distancia en kilómetros, también puede usarla en una cláusula orderby. Por ejemplo, esta consulta devuelve todos los hoteles de lujo en el índice, pero los más cercanos a la Torre Eiffel se enumeran primero:

search=(Description:luxury OR Category:luxury)&orderby=geo.distance(Location, geography'POINT(2.294481 48.858370)') asc&$select=HotelId, HotelName, Category, Tags, Description&$count=true

En esta consulta, asc especifica que los hoteles de lujo se devuelven en orden ascendente según su distancia desde la Torre Eiffel.

Uso de la función geo.intersects

Supongamos que ha decidido que quiere alojarse dentro del distrito 7 de París para su viaje a la Torre Eiffel. Al buscar un hotel, le gustaría especificar esta área con la máxima precisión posible. Puede formular dicha consulta mediante la función geo.intersects.

La función geo.intersects compara una ubicación con un polígono en la superficie terrestre, que se especifica con tres o más puntos. Mediante un polígono, puede crear una forma que se aproxime mucho a un área, como un distrito. Use este polígono para agregar un filtro geográfico a la consulta:

search=(Description:luxury OR Category:luxury) AND geo.intersects(Location, geography'POLYGON((2.32 48.91, 2.27 48.91, 2.27 48.60, 2.32 48.60, 2.32 48.91))')&$select=HotelId, HotelName, Category, Tags, Description&$count=true

Esta consulta devuelve todos los hoteles de lujo dentro de un cuadrado alrededor de la Torre Eiffel. Puede usar más de cuatro puntos para crear un área más precisa.

Importante

En los polígonos, debe especificar los puntos en orden contrario a las agujas del reloj y el polígono debe estar cerrado, lo que significa que el primer y el último punto especificados deben ser los mismos.

geo.intersects devuelve un valor booleano, por lo que no es posible usarlo en una cláusula orderby.