Fungsi geo-spasial OData di Pencarian Azure AI - geo.distance
dan geo.intersects
Azure AI Search mendukung kueri geo-spasial dalam ekspresi filter OData melalui geo.distance
fungsi dan geo.intersects
. Fungsi geo.distance
ini mengembalikan jarak dalam kilometer antara dua titik, satu menjadi variabel bidang atau rentang, dan satu menjadi konstanta yang dilewati sebagai bagian dari filter. Fungsi geo.intersects
mengembalikan true
jika titik tertentu berada dalam poligon tertentu, di mana titiknya adalah variabel bidang atau rentang dan poligon ditentukan sebagai konstanta yang diteruskan sebagai bagian dari filter.
Fungsi geo.distance
juga dapat digunakan dalam parameter $orderby dari untuk mengurutkan hasil pencarian dengan jarak dari titik tertentu. Sintaksis untuk geo.distance
dalam $orderby sama dengan yang ada di $filter. Saat menggunakan geo.distance
dalam $orderby, bidang yang diterapkannya harus memiliki tipe Edm.GeographyPoint
dan juga harus dapat diurutkan.
Catatan
Saat menggunakan geo.distance
di dalam parameter $orderby, bidang yang Anda lewati ke fungsi hanya harus berisi satu titik geo. Dengan kata lain, harus berjenis Edm.GeographyPoint
dan bukan Collection(Edm.GeographyPoint)
. Tidak dimungkinkan untuk mengurutkan bidang koleksi di Azure AI Search.
Sintaks
EBNF (Extended Backus-Naur Form) berikut mendefinisikan tata bahasa geo.distance
dan geo.intersects
fungsi, serta nilai geo-spasial tempat mereka beroperasi:
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)*
Diagram sintaksis interaktif juga tersedia:
Catatan
Lihat Referensi sintaks ekspresi OData untuk Pencarian Azure AI untuk EBNF lengkap.
geo.distance
Fungsi geo.distance
mengambil dua parameter jenis Edm.GeographyPoint
dan mengembalikan nilai Edm.Double
yang merupakan jarak di antaranya dalam kilometer. Ini berbeda dari layanan lain yang mendukung operasi geo-spasial OData, yang biasanya mengembalikan jarak dalam meter.
Salah satu parameter kegeo.distance
harus merupakan konstanta titik geografi, dan yang lainnya harus merupakan jalur bidang (atau variabel rentang dalam kasus filter yang berulang di atas bidang jenis Collection(Edm.GeographyPoint)
). Urutan parameter ini tidak penting.
Konstanta titik geografi adalah formulir geography'POINT(<longitude> <latitude>)'
, di mana garis bujur dan lintang adalah konstanta numerik.
Catatan
Saat menggunakan geo.distance
di dalam filter, Anda harus membandingkan jarak yang dikembalikan oleh fungsi dengan konstanta menggunakan lt
, le
, gt
, atau ge
. Operator eq
dan ne
tidak didukung saat membandingkan jarak. Misalnya, berikut adalah penggunaan yang benar dari geo.distance
: $filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5
.
geo.intersects
Fungsi geo.intersects
ini mengambil variabel jenis Edm.GeographyPoint
dan konstanta Edm.GeographyPolygon
dan mengembalikan sebuah Edm.Boolean
-- true
jika titik berada dalam batas poligon, jika tidak false
.
Poligon adalah permukaan dua dimensi yang disimpan sebagai urutan titik yang mendefinisikan cincin batas (lihat contoh di bawah). Poligon perlu ditutup, artinya set poin pertama dan terakhir harus sama. Titik-titik dalam poligon harus dalam urutan berlawanan arah jarum jam.
Kueri geo-spasial dan poligon yang mencakup meridian ke-180
Bagi banyak pustaka kueri geo-spasial, merumuskan kueri yang menyertakan meridian ke-180 (di dekat garis tanggal) adalah melampau batasnya atau memerlukan solusi sementara, seperti memisahkan poligon menjadi dua, satu di kedua sisi meridian.
Dalam Azure AI Search, kueri geo-spasial yang menyertakan bujur 180 derajat akan berfungsi seperti yang diharapkan jika bentuk kueri berbentuk persegi panjang dan koordinat Anda selaras dengan tata letak kisi di sepanjang bujur dan lintang (misalnya, geo.intersects(location, geography'POLYGON((179 65, 179 66, -179 66, -179 65, 179 65))'
). Jika tidak, untuk bentuk non-persegi panjang atau tidak sejajar, pertimbangkan pendekatan poligon terpisah.
Fungsi geo-spasial dan null
Seperti semua bidang non-koleksi lainnya di Azure AI Search, bidang jenis Edm.GeographyPoint
dapat berisi null
nilai. Saat Azure AI Search mengevaluasi geo.intersects
bidang yaitu null
, hasilnya akan false
selalu . Perilaku geo.distance
dalam hal ini tergantung pada konteks:
- Dalam filter,
geo.distance
dari bidangnull
menghasilkannull
. Ini berarti dokumen tidak akan cocok karenanull
dibandingkan dengan nilai bukan nol yang dievaluasi kefalse
. - Saat mengurutkan hasil menggunakan $orderby, bidang
geo.distance
darinull
menghasilkan jarak maksimum yang mungkin. Dokumen dengan bidang seperti itu akan mengurutkan lebih rendah daripada yang lain saat arah pengurutanasc
digunakan (default), dan lebih tinggi dari yang lain saat arahnyadesc
.
Contoh
Contoh filter
Temukan semua hotel dalam jarak 10 kilometer dari titik referensi tertentu (di mana lokasi adalah bidang tipe Edm.GeographyPoint
):
geo.distance(location, geography'POINT(-122.131577 47.678581)') le 10
Temukan semua hotel dalam viewport tertentu yang digambarkan sebagai poligon (di mana lokasi adalah bidang jenis Edm.GeographyPoint
). Perhatikan bahwa poligon ditutup (set poin pertama dan terakhir harus sama) dan poin harus dicantumkan dalam urutan berlawanan arah jarum jam.
geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')
Contoh order-by
Urutkan hotel secara menurun menurut rating
, lalu naik menurut jaraknya dari koordinat yang diberikan:
rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc
Urutkan hotel dalam urutan menurun menurut search.score
dan rating
, lalu dalam urutan menaik menurut jarak dari koordinat yang diberikan sehingga di antara dua hotel dengan peringkat yang identik, yang terdekat dicantumkan terlebih dahulu:
search.score() desc,rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc