De zoekervaring verbeteren door resultaten te ordenen op afstand van een bepaald referentiepunt

Voltooid

Vaak willen gebruikers zoeken naar items die zijn gekoppeld aan een geografische locatie. Ze willen bijvoorbeeld de dichtstbijzijnde koffiebar vinden op hun locatie. Ai Search bevat georuimtelijke functies die u in query's kunt aanroepen om locaties op het aardoppervlak te vergelijken.

Hier leert u hoe u kunt zoeken naar dingen die zich in de buurt van een fysiek punt of in een begrensd gebied bevinden.

Wat zijn georuimtelijke functies?

In eerdere lessen in deze module hebt u gezien hoe gebruikers een hotel kunnen vinden door velden op te geven die moeten worden gezocht, zoals Description en Category:

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

Een belangrijke overweging bij het boeken van een hotel is de geografische locatie. Als u bijvoorbeeld een reis boekt om de Eiffeltoren te zien, wilt u een hotel in de buurt.

Als u AI Search wilt vragen om resultaten te retourneren op basis van hun locatiegegevens, kunt u twee functies in uw query gebruiken:

  • geo.distance. Deze functie retourneert de afstand in een rechte lijn over het aardoppervlak vanaf het punt dat u opgeeft tot de locatie van het zoekresultaat.
  • geo.intersects. Deze functie retourneert true als de locatie van een zoekresultaat zich in een veelhoek bevindt die u opgeeft.

Als u deze functies wilt gebruiken, moet u ervoor zorgen dat uw index de locatie voor resultaten bevat. Locatievelden moeten het gegevenstype Edm.GeographyPoint hebben en de breedte- en lengtegraad opslaan.

De functie geo.distance gebruiken

geo.distance is een functie die twee punten als parameters neemt en de afstand tussen deze punten in kilometers retourneert.

Stel dat u op zoek bent naar een hotel in de buurt van de Eiffeltoren. U kunt de bovenstaande query wijzigen en een nieuw filter toevoegen:

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

Deze query retourneert alle luxe hotels in de index binnen vijf kilometer van de Eiffeltoren. In de query:

  • Location is de naam van het veld waarin de locatie van het hotel wordt opgeslagen.
  • geography'POINT(2.294481 48.858370)' is de locatie van de Eiffeltoren als lengtegraad en breedtegraad.
  • le 5 geeft aan dat hotels in de resultaten moeten worden opgenomen als de geo.distance functie een getal retourneert dat kleiner is dan of gelijk is aan vijf kilometer.

Belangrijk

Wanneer u in een filter gebruikt geo.distance , worden de operatoren die gelijk zijn aan (eq) en niet gelijk aan (ne) niet ondersteund. Gebruik in plaats daarvan lt, leof gtge.

Omdat geo.distance retourneert enkele kilometers, kunt u het ook in een orderby component gebruiken. Deze query retourneert bijvoorbeeld alle luxe hotels in de index, maar de hotels die het dichtst bij de Eiffeltoren liggen, worden als eerste weergegeven:

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

In deze query asc geeft u aan dat de luxe hotels worden geretourneerd in oplopende volgorde van hun afstand van de Eiffeltoren.

De functie geo.intersects gebruiken

Stel dat u hebt besloten dat u wilt verblijven in het zevende arrondissement van Parijs voor uw reis naar de Eiffeltoren. Wanneer u een hotel zoekt, wilt u dit gebied zo nauwkeurig mogelijk opgeven. U kunt een dergelijke query formuleren met behulp van de geo.intersects functie.

De geo.intersects functie vergelijkt een locatie met een veelhoek op het aardoppervlak, die u opgeeft met drie of meer punten. Met behulp van een veelhoek kunt u een shape maken die nauw overeenkomt met een gebied, zoals een arrondissement. Gebruik deze veelhoek om een geografisch filter toe te voegen aan uw query:

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

Deze query retourneert alle luxe hotels binnen een plein rond de Eiffeltoren. U kunt meer dan vier punten gebruiken om een nauwkeuriger gebied te maken.

Belangrijk

In veelhoeken moet u de punten opgeven in rechtsomvolgorde en moet de veelhoek worden gesloten, wat betekent dat de eerste en laatste punten die zijn opgegeven, hetzelfde moeten zijn.

geo.intersects retourneert een Booleaanse waarde, dus het is niet mogelijk om deze te gebruiken in een orderby component.