Ulepszanie środowiska wyszukiwania przez porządkowanie wyników według odległości od danego punktu odniesienia
Często użytkownicy chcą wyszukiwać elementy skojarzone z lokalizacją geograficzną. Na przykład mogą chcieć znaleźć najbliższy kawiarnię w swojej lokalizacji. Aby ułatwić porównywanie lokalizacji na powierzchni Ziemi, funkcja wyszukiwania sztucznej inteligencji obejmuje funkcje geoprzestrzewne, które można wywoływać w zapytaniach.
W tym miejscu dowiesz się, jak wyszukiwać rzeczy znajdujące się w pobliżu fizycznego punktu lub w ograniczonym obszarze.
Co to są funkcje geoprzestrzene?
W poprzednich lekcjach w tym module pokazano, jak użytkownicy mogą zlokalizować hotel, określając pola do wyszukiwania, takie jak Description
i Category
:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
Ważną kwestią podczas rezerwacji hotelu jest jego lokalizacja geograficzna. Jeśli na przykład rezerwujesz podróż, aby zobaczyć Wieżę Eiffla, w pobliżu znajduje się hotel.
Aby poprosić usługę AI Search o zwrócenie wyników na podstawie informacji o ich lokalizacji, możesz użyć dwóch funkcji w zapytaniu:
geo.distance
. Ta funkcja zwraca odległość w prostej linii na powierzchni Ziemi od punktu określonego do lokalizacji wyniku wyszukiwania.geo.intersects
. Ta funkcja zwracatrue
, jeśli lokalizacja wyniku wyszukiwania znajduje się wewnątrz określonego wielokąta.
Aby użyć tych funkcji, upewnij się, że indeks zawiera lokalizację wyników. Pola lokalizacji powinny mieć typ Edm.GeographyPoint
danych i przechowywać szerokość geograficzną i długość geograficzną.
Korzystanie z funkcji geo.distance
geo.distance
to funkcja, która przyjmuje dwa punkty jako parametry i zwraca odległość między nimi w kilometrach.
Załóżmy, że szukasz hotelu w pobliżu Wieży Eiffla. Powyższe zapytanie można zmodyfikować, dodając nowy filtr:
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
To zapytanie zwraca wszystkie luksusowe hotele w indeksie w ciągu pięciu kilometrów od Wieży Eiffla. W zapytaniu:
Location
to nazwa pola, które przechowuje lokalizację hotelu.geography'POINT(2.294481 48.858370)'
to lokalizacja Wieży Eiffla jako długość geograficzna i szerokość geograficzna.le 5
określa, że hotele powinny być uwzględnione w wynikach, jeśligeo.distance
funkcja zwraca liczbę mniejszą lub równą pięciu kilometrów.
Ważne
W przypadku użycia geo.distance
w filtrze operatory równe (eq
) i nie równe (ne
) nie są obsługiwane. Zamiast tego użyj polecenia lt
, , le
gt
lub ge
.
Ponieważ geo.distance
zwraca odległość w kilometrach, możesz również użyć jej w klauzuli orderby
. Na przykład to zapytanie zwraca wszystkie luksusowe hotele w indeksie, ale te znajdujące się najbliżej Wieży Eiffla są wymienione jako pierwsze:
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
W tym zapytaniu określa, asc
że luksusowe hotele są zwracane w kolejności rosnącej od wieży Eiffla.
Używanie funkcji geo.intersects
Załóżmy, że chcesz pozostać w siódmej dzielnicy Paryża na wycieczkę do Wieży Eiffla. Podczas wyszukiwania hotelu chcesz określić ten obszar tak dokładnie, jak to możliwe. Takie zapytanie można sformułować przy użyciu geo.intersects
funkcji .
Funkcja geo.intersects
porównuje lokalizację z wielokątem na powierzchni Ziemi, którą określasz z co najmniej trzema punktami. Za pomocą wielokąta można utworzyć kształt, który ściśle pasuje do obszaru, takiego jak arrondissement. Użyj tego wielokąta, aby dodać filtr geograficzny do zapytania:
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
To zapytanie zwraca wszystkie luksusowe hotele na placu wokół Wieży Eiffla. Aby utworzyć bardziej precyzyjny obszar, można użyć więcej niż czterech punktów.
Ważne
W wielokątach należy określić punkty w kolejności odwrotnej, a wielokąt musi być zamknięty, co oznacza, że pierwsze i ostatnie określone punkty muszą być takie same.
geo.intersects
zwraca wartość logiczną, więc nie można jej użyć w klauzuli orderby
.