Azure AI 搜尋中的 OData 地理空間函式 - geo.distance
和 geo.intersects
Azure AI 搜尋可透過 geo.distance
和 geo.intersects
函式,在 OData 篩選表示式中支援地理空間查詢。 函 geo.distance
式會傳回兩個點之間的公里距離,一個是字段或範圍變數,另一個是作為篩選條件一部分傳遞的常數。 geo.intersects
如果指定的點位於指定的多邊形內,則函式會true
傳回 ,其中該點是欄位或範圍變數,而且多邊形會指定為篩選條件一部分傳遞的常數。
函geo.distance
式也可以在 $orderby 參數中使用,依距離指定點的距離來排序搜尋結果。 $orderby 的語法與$filter中的語法geo.distance
相同。 在 $orderby中使用 geo.distance
時,其套用的欄位必須是類型Edm.GeographyPoint
,而且也必須可排序。
注意
在 $orderby 參數中使用 geo.distance
時,您傳遞給函式的字段必須只包含單一地理點。 換句話說,它必須是 類型 Edm.GeographyPoint
,而不是 Collection(Edm.GeographyPoint)
。 無法在 Azure AI 搜尋服務中排序集合欄位。
語法
下列 EBNF (Extended Backus-Naur Form) 會定義 和 geo.intersects
函式的geo.distance
文法,以及其運作所在的地理空間值:
geo_distance_call ::=
'geo.distance(' variable ',' geo_point ')'
| 'geo.distance(' geo_point ',' variable ')'
geo_point ::= "geography'POINT(" lon_lat ")'"
lon_lat ::= float_literal ' ' float_literal
geo_intersects_call ::=
'geo.intersects(' variable ',' geo_polygon ')'
/* You need at least four points to form a polygon, where the first and
last points are the same. */
geo_polygon ::=
"geography'POLYGON((" lon_lat ',' lon_lat ',' lon_lat ',' lon_lat_list "))'"
lon_lat_list ::= lon_lat(',' lon_lat)*
我們也提供互動式語法圖表:
注意
如需完整的 EBNF,請參閱 Azure AI 搜尋服務的 OData 運算式語法參考。
geo.distance
函 geo.distance
式會採用類型的 Edm.GeographyPoint
兩個 Edm.Double
參數,並傳回以公里為單位的距離值。 這與其他支援 OData 地理空間作業的服務不同,這些作業通常會以公尺為單位傳回距離。
其中一個參數 geo.distance
必須是 geography 點常數,另一個參數必須是欄位路徑(或在篩選逐一查看類型 Collection(Edm.GeographyPoint)
字段的情況下的範圍變數)。 這些參數的順序並不重要。
geography 點常數的格式 geography'POINT(<longitude> <latitude>)'
為 ,其中經度和緯度是數值常數。
注意
geo.distance
在篩選中使用 時,您必須使用 lt
、le
、 gt
或 ge
來比較函式所傳回的距離與常數。 比較距離時不支援 和 ne
運算符eq
。 例如,這是的正確用法 geo.distance
: $filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5
。
geo.intersects
函geo.intersects
式會採用 類型的Edm.GeographyPoint
變數和常數Edm.GeographyPolygon
,如果點位於多邊形的範圍內,則傳回 ,false
否則傳回Edm.Boolean
-- true
。
多邊形是一個二維表面,儲存為定義周框環形的點序列(請參閱 下列範例 )。 多邊形必須關閉,這表示第一個和最後一個點集合必須相同。 多邊形中的點必須以逆時針順序排列。
跨越第180個經線的地理空間查詢和多邊形
對於許多地理空間查詢連結庫,制定包含第180個子午線(接近日期線)的查詢是非限制,或需要因應措施,例如將多邊形分割成兩個,一個在子午線的任一端。
在 Azure AI 搜尋服務中,如果查詢圖形是矩形,且您的座標會沿著經度和緯度對齊網格線配置(例如, geo.intersects(location, geography'POLYGON((179 65, 179 66, -179 66, -179 65, 179 65))'
),包含 180 度經度的地理空間查詢會如預期般運作。 否則,針對非矩形或未對齊的圖形,請考慮分割多邊形方法。
地理空間函式和 null
就像 Azure AI 搜尋中所有其他非集合欄位一樣,類型的 Edm.GeographyPoint
欄位可以包含 null
值。 當 Azure AI 搜尋評估 geo.intersects
為 的 null
欄位時,結果一律為 false
。 在此情況下的行為 geo.distance
取決於內容:
- 在篩選中
null
,geo.distance
欄位的結果為null
。 這表示檔案不會相符,因為null
與任何非 Null 值相較之下會評估為false
。 - 使用 $orderby排序結果時,
geo.distance
null
欄位會產生最大可能距離。 使用排序方向asc
時,具有這類欄位的檔會比所有其他欄位都低排序(預設值),而當方向為desc
時,則高於所有其他欄位。
範例
篩選範例
指定參考點的 10 公里內尋找所有酒店(其中位置是類型的 Edm.GeographyPoint
欄位):
geo.distance(location, geography'POINT(-122.131577 47.678581)') le 10
在指定檢視區內尋找描述為多邊形的所有酒店(其中location是類型的 Edm.GeographyPoint
欄位)。 請注意,多邊形已關閉(第一個和最後一個點集合必須相同),而且 點必須以逆時針順序列出。
geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')
Order-by 範例
依 遞減 rating
排序旅館,然後依指定座標的距離遞增:
rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc
依 和 rating
以遞減順序search.score
排序旅館,然後依與指定座標的距離遞增順序排序酒店,使兩家酒店之間的評分相同,最接近的會先列出:
search.score() desc,rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc