Ulepszanie środowiska wyszukiwania przez porządkowanie wyników według odległości od danego punktu odniesienia

Ukończone

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 zwraca true , 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śli geo.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, , legtlub 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 .