Geoprostorové funkce OData ve službě Azure AI Search – geo.distance
a geo.intersects
Azure AI Search podporuje geoprostorové dotazy ve výrazech filtru OData prostřednictvím geo.distance
a geo.intersects
funkcí. Funkce geo.distance
vrátí vzdálenost v kilometrech mezi dvěma body, jedna je pole nebo proměnná oblasti a jedna je konstantou předanou jako součást filtru. Funkce geo.intersects
vrátí true
, pokud je daný bod v daném mnohoúhelníku, kde bod je pole nebo proměnná oblasti a mnohoúhelník je určen jako konstanta předaná jako součást filtru.
Funkci geo.distance
lze také použít v parametru $orderby k seřazení výsledků hledání podle vzdálenosti od daného bodu. Syntaxe pro geo.distance
$orderby je stejná jako v $filter. Při použití geo.distance
v $orderby musí být pole, na které se vztahuje, typu Edm.GeographyPoint
a musí být také seřazené.
Poznámka:
Při použití geo.distance
v parametru $orderby musí pole, které funkci předáte, obsahovat pouze jeden geografický bod. Jinými slovy, musí být typu Edm.GeographyPoint
, nikoli Collection(Edm.GeographyPoint)
. V Azure AI Search není možné řadit podle polí kolekce.
Syntaxe
Následující ebNF (Extended Backus-Naur Form) definuje gramatiku geo.distance
funkcí a geo.intersects
také geoprostorové hodnoty, na kterých pracují:
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)*
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
geo.distance
Funkce geo.distance
přebírá dva parametry typu Edm.GeographyPoint
a vrací Edm.Double
hodnotu, která je vzdáleností mezi nimi v kilometrech. To se liší od jiných služeb, které podporují geoprostorové operace OData, což obvykle vrací vzdálenosti v metrech.
Jeden z parametrů geo.distance
musí být konstanta zeměpisného bodu a druhý musí být cesta k poli (nebo proměnná oblasti v případě iterace filtru přes pole typu Collection(Edm.GeographyPoint)
). Pořadí těchto parametrů nezáleží.
Zeměpisná bodová konstanta je ve tvaru geography'POINT(<longitude> <latitude>)'
, kde zeměpisná délka a zeměpisná šířka jsou číselné konstanty.
Poznámka:
Při použití geo.distance
ve filtru je nutné porovnat vzdálenost vrácenou funkcí pomocí konstanty pomocí lt
, le
, gt
, nebo ge
. Operátory eq
a ne
nejsou podporovány při porovnávání vzdáleností. Jedná se například o správné použití geo.distance
: $filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5
.
geo.intersects
Funkce geo.intersects
přebírá proměnnou typu Edm.GeographyPoint
a konstantu Edm.GeographyPolygon
a vrátítrue
Edm.Boolean
-- hodnotu, pokud je bod v mezích mnohoúhelníku, false
jinak.
Mnohoúhelník je dvourozměrný povrch uložený jako posloupnost bodů definujících ohraničující prstenec (viz příklady níže). Mnohoúhelník musí být uzavřen, což znamená, že první a poslední množiny bodů musí být stejné. Body v mnohoúhelníku musí být v proti směru hodinových ručiček.
Geoprostorové dotazy a mnohoúhelníky, které pokrývají 180. poledník
U mnoha knihoven geoprostorových dotazů, které označují dotaz, který obsahuje 180. poledník (poblíž data) je buď mimo limity, nebo vyžaduje alternativní řešení, například rozdělení mnohoúhelníku na dvě, jednu na obou stranách poledníku.
Ve službě Azure AI Search budou geografické dotazy, které obsahují délku 180 stupňů, fungovat podle očekávání, pokud je tvar dotazu obdélníkový a souřadnice odpovídají rozložení mřížky podél délky a zeměpisné šířky (například geo.intersects(location, geography'POLYGON((179 65, 179 66, -179 66, -179 65, 179 65))'
). V opačném případě u neúhelníkových nebo nezarovnaných obrazců zvažte přístup rozděleného mnohoúhelníku.
Geoprostorové funkce a null
Stejně jako všechna ostatní pole mimo kolekci ve službě Azure AI Search můžou pole typu Edm.GeographyPoint
obsahovat null
hodnoty. Když Azure AI Search vyhodnotí geo.intersects
pole, které je null
, výsledek bude vždy false
. Chování geo.distance
v tomto případě závisí na kontextu:
- Ve filtrech
geo.distance
null
je výsledkemnull
pole . To znamená, že dokument se neshoduje, protoženull
v porovnání s žádnou hodnotou, která není null, se vyhodnotí jakofalse
. - Při řazení výsledků pomocí $orderby
geo.distance
null
má pole maximální možnou vzdálenost. Dokumenty s tímto polem budou řadit nižší než všechny ostatní, když se použije směrasc
řazení (výchozí) a vyšší než všechny ostatní, pokud jedesc
směr .
Příklady
Příklady filtrů
Najděte všechny hotely v okruhu 10 kilometrů od daného referenčního bodu (kde umístění je pole typu Edm.GeographyPoint
):
geo.distance(location, geography'POINT(-122.131577 47.678581)') le 10
Najděte všechny hotely v daném oblasti zobrazení popsané jako mnohoúhelník (kde umístění je pole typu Edm.GeographyPoint
). Všimněte si, že mnohoúhelník je uzavřen (první a poslední množiny bodů musí být stejné) a body musí být uvedeny v pořadí proti směru hodinových ručiček.
geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')
Příklady seřazené podle
Seřaďte hotely sestupně podle rating
, potom vzestupně podle vzdálenosti od daných souřadnic:
rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc
Seřaďte hotely v sestupném pořadí podle search.score
a rating
potom ve vzestupném pořadí podle vzdálenosti od daných souřadnic tak, aby mezi dvěma hotely s identickými hodnoceními byla uvedena jako první:
search.score() desc,rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc