Mejora de la experiencia de búsqueda ordenando los resultados por distancia desde un punto de referencia determinado
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 devuelvetrue
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óngeo.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
.