Améliorer l’expérience de recherche en triant les résultats par distance à partir d’un point de référence donné

Effectué

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 renvoie true 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 fonction geo.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.