根據與指定參考點的距離來排序結果,以改善搜尋體驗

已完成

使用者通常會想要搜尋與地理位置相關聯的項目。 例如,他們可能想要找到最接近其位置的咖啡店。 為了協助您比較地球表面的位置,AI 搜尋服務包含可在查詢中呼叫的地理空間函式。

在這裡,您將了解如何搜尋靠近實體點或界限區域內的項目。

什麼是地理空間函式?

在本課程模組的上一個單元中,您已了解如何藉由指定要搜尋的欄位來尋找旅館,例如 DescriptionCategory

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

當您預訂旅館時,一個重要的考慮是其地理位置。 例如,如果您要預訂觀賞艾菲爾鐵塔的旅程,您會需要靠近艾菲爾鐵塔的旅館。

若要要求AI 搜尋服務根據其位置資訊傳回結果,您可以在查詢中使用兩個函式:

  • geo.distance. 此函式會從您指定到搜尋結果位置的點,傳回地球表面的直線距離。
  • geo.intersects. 如果搜尋結果的位置位於您指定的多邊形內,則此函式會傳回 true

若要使用這些函式,請確定您的索引包含結果的位置。 位置欄位應具有資料類型 Edm.GeographyPoint,並儲存緯度和經度。

使用 geo.distance 函式

geo.distance 是一個函式,接受兩個點做為參數,並以公里為單位傳回它們之間的距離。

假設您正在尋找艾菲爾鐵塔附近的一家旅館。 您可以修改上述查詢,並新增新的篩選:

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

此查詢會傳回艾菲爾鐵塔五公里內索引中的所有豪華旅館。 在查詢中:

  • Location 是儲存旅館位置的功能變數名稱。
  • geography'POINT(2.294481 48.858370)' 是艾菲爾鐵塔作為經度和緯度的位置。
  • le 5 指定如果 geo.distance 函式傳回小於或等於五公里的數字,應該將旅館包含在結果中。

重要

當您在篩選中使用 geo.distance 時,不支援等於 (eq) 且不等於 (ne) 運算子。 請改用 ltlegtge

因為 geo.distance 會傳回數公里內的距離,所以您也可以在 orderby 子句中加以使用。 例如,此查詢會傳回索引中的所有豪華旅館,但最接近艾菲爾鐵塔的豪華旅館會先列出:

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

在此查詢中,asc 指定豪華旅館會以與艾菲爾鐵塔距離的遞增順序傳回。

使用 geo.intersects 函式

假設您已決定要留在巴黎第七區,前往艾菲爾鐵塔。 當您搜尋旅館時,您想要盡可能精確地指定此區域。 您可以使用 geo.intersects 函式來制定這類查詢。

geo.intersects 函式會比較位置與地球表面的多邊形,而您用三個或多個點指定。 藉由使用多邊形,您可以建立與區域緊密相符的圖形,例如行政區。 使用此多邊形將地理篩選新增至查詢:

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

此查詢會傳回艾菲爾鐵塔周圍廣場內的所有豪華旅館。 您可以使用四個以上的點來建立更精確的區域。

重要

在多邊形中,您必須以逆時針順序指定點,而且多邊形必須關閉,這表示指定的第一個和最後一個點必須相同。

geo.intersects 會傳回布林值,因此無法在 orderby 子句中加以使用。