Aracılığıyla paylaş


Azure AI Search'te OData coğrafi uzamsal işlevleri - geo.distance ve geo.intersects

Azure AI Search, ve geo.intersects işlevleri aracılığıyla geo.distance OData filtre ifadelerinde coğrafi uzamsal sorguları destekler. İşlev geo.distance , biri alan veya aralık değişkeni, diğeri de filtrenin bir parçası olarak geçirilen sabit olmak üzere iki nokta arasındaki mesafeyi kilometre cinsinden döndürür. İşlev geo.intersects , belirli bir nokta belirli bir çokgen içindeyse döndürür true ; burada nokta bir alan veya aralık değişkenidir ve çokgen filtrenin bir parçası olarak geçirilen sabit olarak belirtilir.

İşlev, geo.distance arama sonuçlarını belirli bir noktadan uzaklıklara göre sıralamak için $orderby parametresinde de kullanılabilir. $orderby için söz dizimigeo.distance, $filter ile aynıdır. geo.distance$orderby kullanırken, uygulandığı alan türünde Edm.GeographyPoint olmalı ve ayrıca sıralanabilir olmalıdır.

Dekont

$orderby parametresinde kullanırkengeo.distance, işleve geçirdiğiniz alan yalnızca tek bir coğrafi nokta içermelidir. Başka bir deyişle, türünde olmalı Edm.GeographyPoint ve olmamalıdır Collection(Edm.GeographyPoint). Azure AI Search'te koleksiyon alanlarına göre sıralama yapmak mümkün değildir.

Sözdizimi

Aşağıdaki EBNF (Genişletilmiş Backus-Naur Formu), ve geo.intersects işlevlerinin geo.distance dil bilgisini ve üzerinde çalıştıkları coğrafi uzamsal değerleri tanımlar:

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)*

Etkileşimli söz dizimi diyagramı da kullanılabilir:

Dekont

EbNF'nin tamamı için bkz . Azure AI Search için OData ifade söz dizimi başvurusu.

geo.distance

geo.distance işlevi, türünde Edm.GeographyPoint iki parametre alır ve kilometre cinsinden aralarındaki uzaklık olan bir Edm.Double değer döndürür. Bu, genellikle mesafeleri metre cinsinden döndüren OData coğrafi uzamsal işlemlerini destekleyen diğer hizmetlerden farklıdır.

parametresinin geo.distance coğrafya noktası sabiti, diğerinin ise alan yolu (veya türündeki Collection(Edm.GeographyPoint)bir alan üzerinde yineleyen bir filtre olması durumunda bir aralık değişkeni) olması gerekir. Bu parametrelerin sırası önemli değildir.

Coğrafya noktası sabiti, boylam ve enlemlerin sayısal sabitler olduğu biçimindedir geography'POINT(<longitude> <latitude>)'.

Dekont

Filtrede kullanırkengeo.distance, işlevin döndürdiği uzaklığı , , legtveya gekullanarak ltbir sabitle karşılaştırmanız gerekir. ve işleçleri eqne , mesafeler karşılaştırılırken desteklenmez. Örneğin, bu doğru kullanımıdır geo.distance: $filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5.

geo.intersects

işlevigeo.intersects, türü Edm.GeographyPoint ve sabiti Edm.GeographyPolygon olan bir değişken alır ve nokta çokgen sınırları içindeyse bir döndürürtrueEdm.Boolean -- , false aksi takdirde.

Çokgen, sınırlayıcı halka tanımlayan nokta dizisi olarak depolanan iki boyutlu bir yüzeydir (aşağıdaki örneklere bakın). Çokgenin kapatılması gerekir, yani ilk ve son nokta kümeleri aynı olmalıdır. Çokgendeki noktalar saat yönünün tersine olmalıdır.

180. meridyeni kapsayan coğrafi uzamsal sorgular ve çokgenler

180. meridyen içeren bir sorguyu (tarih çizgisinin yakınında) formüle eden birçok coğrafi uzamsal sorgu kitaplığı için sınırlar dışındadır veya çokgeni meridyenin iki tarafında bir tane olmak üzere ikiye bölme gibi bir geçici çözüm gerektirir.

Azure AI Search'te, 180 derece boylam içeren coğrafi uzamsal sorgular, sorgu şekli dikdörtgense ve koordinatlarınız boylam ve enlem boyunca bir kılavuz düzenine hizalanırsa beklendiği gibi çalışır (örneğin). geo.intersects(location, geography'POLYGON((179 65, 179 66, -179 66, -179 65, 179 65))' Aksi takdirde dikdörtgen olmayan veya hizalanmamış şekiller için bölünmüş çokgen yaklaşımını göz önünde bulundurun.

Coğrafi uzamsal işlevler ve null

Azure AI Search'teki diğer tüm koleksiyon dışı alanlar gibi, türdeki Edm.GeographyPoint alanlar da değer içerebilir null . Azure AI Search olan bir alanı değerlendirdiğinde geo.intersects sonuç her zaman olurfalse.null Bu durumda davranışı geo.distance bağlama bağlıdır:

  • Filtrelerde, geo.distance bir null alanın sonucu olarak elde eder null. Bu, null olmayan herhangi bir değer olarak değerlendirildiği nullfalseiçin belgenin eşleşmeyeceği anlamına gelir.
  • $orderby kullanarak sonuçları sıralarken, geo.distance bir null alanın mümkün olan en yüksek uzaklığı elde edilir. Böyle bir alana sahip belgeler, sıralama yönü asc kullanıldığında diğerlerinden daha düşük (varsayılan) ve yön olduğunda descdiğerlerinden daha yüksek sıralanır.

Örnekler

Filtre örnekleri

Belirli bir referans noktasına 10 kilometre mesafedeki tüm otelleri bulun (konum, türünde Edm.GeographyPointbir alantır):

    geo.distance(location, geography'POINT(-122.131577 47.678581)') le 10

Çokgen olarak tanımlanan belirli bir görünüm penceresi içindeki tüm otelleri bulun (konum türündeki Edm.GeographyPointbir alandır). Çokgenin kapatıldığını (ilk ve son nokta kümeleri aynı olmalıdır) ve noktaların saat yönünün tersine listelenmesi gerektiğini unutmayın.

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')

Siparişe göre örnekler

otellere göre ratingazalan düzende sıralayın ve ardından verilen koordinatlardan uzaklıklara göre artan bir şekilde sıralayın:

    rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc

Otelleri ve ratingdeğerine göre azalan düzende search.score sıralayın ve ardından verilen koordinatlara göre artan düzende sıralayın; böylece aynı derecelendirmeye sahip iki otel arasında en yakın olan önce listelenir:

    search.score() desc,rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc

Sonraki adımlar