Améliorer l’expérience de recherche en triant les résultats par distance à partir d’un point de référence donné
Souvent, les utilisateurs souhaitent rechercher des éléments associés à un emplacement géographique. Par exemple, ils souhaitent peut-être trouver le café le plus proche de leur emplacement. Pour vous aider à comparer des localisations à la surface de la Terre, Recherche Azure AI inclut des fonctions géospatiales que vous pouvez appeler dans des requêtes.
Ici, vous allez apprendre à rechercher des éléments proches d’un point physique ou d’une zone délimitée.
Que sont les fonctions géo-spatiales ?
Dans les unités précédentes de ce module, vous avez vu comment les utilisateurs peuvent localiser un hôtel en spécifiant des champs à rechercher, comme Description
et Category
:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Une considération importante lorsque vous réservez un hôtel est son emplacement géographique. Par exemple, si vous réservez un voyage pour voir la Tour Eiffel, vous voudrez un hôtel situé à proximité.
Pour demander à Recherche Azure AI de retourner des résultats en fonction de leurs informations de localisation, vous pouvez utiliser deux fonctions dans votre requête :
geo.distance
. Cette fonction renvoie la distance en ligne droite à travers la surface de la Terre entre le point que vous spécifiez et l’emplacement du résultat de la recherche.geo.intersects
. Cette fonction renvoietrue
si l’emplacement d’un résultat de recherche se trouve à l’intérieur d’un polygone que vous spécifiez.
Pour utiliser ces fonctions, assurez-vous que votre index comprend l’emplacement des résultats. Les champs de localisation doivent avoir le type de données Edm.GeographyPoint
et stocker la latitude et la longitude.
Utiliser la fonction geo.distance
geo.distance
est une fonction qui prend deux points comme paramètres et renvoie la distance qui les sépare en kilomètres.
Supposons que vous cherchez un hôtel près de la Tour Eiffel. Vous pouvez modifier la requête ci-dessus en ajoutant un nouveau filtre :
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
Cette requête retourne tous les hôtels de luxe dans l’index à moins de cinq kilomètres de la Tour Eiffel. Dans la requête :
Location
est le nom du champ qui stocke l’emplacement de l’hôtel.geography'POINT(2.294481 48.858370)'
est l’emplacement de la Tour Eiffel sous forme de longitude et latitude.le 5
spécifie que les hôtels doivent être inclus dans les résultats si la fonctiongeo.distance
retourne un nombre inférieur ou égal à cinq kilomètres.
Important
Lorsque vous utilisez geo.distance
dans un filtre, les opérateurs égal à (eq
) et non égal à (ne
) ne sont pas pris en charge. Utilisez plutôt lt
, le
, gt
ou ge
.
Étant donné que geo.distance
retourne la distance en kilomètres, vous pouvez également l’utiliser dans une clause orderby
. Par exemple, cette requête retourne tous les hôtels de luxe dans l’index, mais ceux les plus proches de la Tour Eiffel sont répertoriés en premier :
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
Dans cette requête, asc
spécifie que les hôtels de luxe sont retournés dans l’ordre croissant de leur distance par rapport à la Tour Eiffel.
Utiliser la fonction geo.intersects
Supposons que vous avez décidé de rester dans le septième arrondissement de Paris pour votre voyage à la Tour Eiffel. Lorsque vous recherchez un hôtel, vous souhaitez spécifier cette zone aussi précisément que possible. Vous pouvez formuler une telle requête à l’aide de la fonction geo.intersects
.
La fonction geo.intersects
compare un emplacement avec un polygone sur la surface de la Terre, que vous spécifiez avec trois points ou plus. En utilisant un polygone, vous pouvez créer une forme qui correspond étroitement à une zone, comme un arrondissement. Utilisez ce polygone pour ajouter un filtre géographique à votre requête :
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
Cette requête retourne tous les hôtels de luxe dans un carré autour de la Tour Eiffel. Vous pouvez utiliser plus de quatre points pour créer une zone plus précise.
Important
Dans les polygones, vous devez spécifier les points dans l’ordre inverse, et le polygone doit être fermé, ce qui signifie que les premiers et les derniers points spécifiés doivent être identiques.
geo.intersects
retourne une valeur booléenne. Il n’est donc pas possible de l’utiliser dans une clause orderby
.