Förbättra sökupplevelsen genom att sortera resultat efter avstånd från en viss referenspunkt
Användare vill ofta söka efter objekt som är associerade med en geografisk plats. De kanske till exempel vill hitta närmaste kafé till sin plats. För att hjälpa dig att jämföra platser på jordens yta innehåller AI Search geo-spatiala funktioner som du kan anropa i frågor.
Här får du lära dig hur du söker efter saker som ligger nära en fysisk punkt eller inom ett avgränsat område.
Vad är geo-spatiala funktioner?
I tidigare enheter i den här modulen såg du hur användare kan hitta ett hotell genom att ange fält att söka i, till exempel Description
och Category
:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Ett viktigt övervägande när du bokar ett hotell är dess geografiska läge. Om du till exempel bokar en resa för att se Eiffeltornet vill du ha ett hotell nära det.
Om du vill be AI Search att returnera resultat baserat på deras platsinformation kan du använda två funktioner i din fråga:
geo.distance
. Den här funktionen returnerar avståndet i en rät linje över jordens yta från den punkt som du anger till platsen för sökresultatet.geo.intersects
. Den här funktionen returnerartrue
om platsen för ett sökresultat finns i en polygon som du anger.
Om du vill använda dessa funktioner kontrollerar du att indexet innehåller platsen för resultaten. Platsfälten ska ha datatypen Edm.GeographyPoint
och lagra latitud och longitud.
Använd funktionen geo.distance
geo.distance
är en funktion som tar två punkter som parametrar och returnerar avståndet mellan dem i kilometer.
Anta att du letar efter ett hotell nära Eiffeltornet. Du kan ändra ovanstående fråga och lägga till ett nytt filter:
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
Den här frågan returnerar alla lyxhotell i indexet inom fem kilometer från Eiffeltornet. I frågan:
Location
är namnet på fältet som lagrar hotellets plats.geography'POINT(2.294481 48.858370)'
är platsen för Eiffeltornet som en longitud och latitud.le 5
anger att hotell ska inkluderas i resultatet omgeo.distance
funktionen returnerar ett tal som är mindre än eller lika med fem kilometer.
Viktigt!
När du använder geo.distance
i ett filter stöds inte operatorerna lika med (eq
) och inte lika med (ne
). Använd lt
i stället , le
, gt
eller ge
.
Eftersom geo.distance
returnerar avståndet i kilometer kan du också använda det i en orderby
sats. Den här frågan returnerar till exempel alla lyxhotell i indexet, men de som är närmast Eiffeltornet visas först:
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
I den här frågan asc
anger du att de lyxiga hotellen returneras i stigande ordning på avståndet från Eiffeltornet.
Använda funktionen geo.intersects
Anta att du har bestämt dig för att du vill stanna inom det sjunde arrondissementet i Paris för din resa till Eiffeltornet. När du söker efter ett hotell vill du ange det här området så exakt som möjligt. Du kan formulera en sådan fråga med hjälp geo.intersects
av funktionen .
Funktionen geo.intersects
jämför en plats med en polygon på jordens yta, som du anger med tre eller fler punkter. Genom att använda en polygon kan du skapa en form som nära matchar ett område, till exempel en arrondissement. Använd den här polygonen för att lägga till ett geografiskt filter i din fråga:
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
Den här frågan returnerar alla lyxhotell på en ruta runt Eiffeltornet. Du kan använda mer än fyra punkter för att skapa ett mer exakt område.
Viktigt!
I polygoner måste du ange punkterna i motsolsordning och polygonen måste stängas, vilket innebär att de första och sista punkterna som anges måste vara desamma.
geo.intersects
returnerar ett booleskt värde, så det går inte att använda det i en orderby
sats.