Operator perbandingan OData di Azure AI Search - eq
, , ne
, lt
gt
, ge
, danle
Operasi paling dasar dalam ekspresi filter OData di Azure AI Search adalah membandingkan bidang dengan nilai tertentu. Dua jenis perbandingan dapat dilakukan – perbandingan kesetaraan, dan perbandingan rentang. Anda dapat menggunakan operator berikut untuk membandingkan bidang dengan nilai konstanta:
Operator kesetaraan:
eq
: Uji apakah bidang setara dengan nilai konstantane
: Uji apakah bidang tidak setara dengan nilai konstanta
Operator rentang:
gt
: Uji apakah bidang lebih besar dari nilai konstantalt
: Uji apakah bidang lebih kecil dari nilai konstantage
: Uji apakah bidang lebih besar dari atau setara dengan nilai konstantale
: Uji apakah bidang lebih kecil dari atau setara dengan nilai konstanta
Anda dapat menggunakan operator rentang bersama dengan operator logis untuk menguji apakah bidang berada dalam rentang nilai tertentu. Lihat contoh nanti dalam artikel ini.
Catatan
Jika mau, Anda dapat menaruh nilai konstanta di sisi kiri operator dan nama bidang di sisi kanannya. Untuk operator rentang, arti perbandingannya terbalik. Misalnya, jika nilai konstanta berada di sisi kiri, gt
akan menguji apakah nilai konstanta lebih besar daripada bidang. Anda juga dapat menggunakan operator perbandingan untuk membandingkan hasil fungsi, seperti geo.distance
, dengan nilai. Untuk fungsi Boolean seperti search.ismatch
, membandingkan hasil dengan true
atau false
bersifat opsional.
Sintaks
EBNF (Extended Backus-Naur Form) berikut menentukan tata bahasa dari ekspresi OData yang menggunakan operator perbandingan.
comparison_expression ::=
variable_or_function comparison_operator constant |
constant comparison_operator variable_or_function
variable_or_function ::= variable | function_call
comparison_operator ::= 'gt' | 'lt' | 'ge' | 'le' | 'eq' | 'ne'
Diagram sintaksis interaktif juga tersedia:
Catatan
Lihat Referensi sintaks ekspresi OData untuk Pencarian Azure AI untuk EBNF lengkap.
Ada dua bentuk ekspresi perbandingan. Satu-satunya perbedaan antara keduanya adalah apakah nilai konstanta muncul di sisi kiri atau kanan operator. Ekspresi di sisi operator yang lain harus berupa variabel atau panggilan fungsi. Variabel dapat berupa nama bidang, atau variabel rentang dalam kasus ekspresi lambda.
Jenis data yang akan dibandingkan
Jenis data di kedua sisi operator perbandingan harus kompatibel. Misalnya, jika sisi kiri adalah bidang jenis Edm.DateTimeOffset
, maka sisi kanan harus berupa konstanta tanggal-waktu. Jenis data numerik bersifat lebih fleksibel. Anda dapat membandingkan variabel dan fungsi dari jenis numerik apa pun dengan konstanta dari jenis numerik lainnya, dengan beberapa batasan, seperti yang dijelaskan dalam tabel berikut.
Jenis fungsi atau variabel | Jenis nilai konstanta | Batasan |
---|---|---|
Edm.Double |
Edm.Double |
Perbandingan tunduk pada aturan khusus untuk NaN |
Edm.Double |
Edm.Int64 |
Konstanta dikonversikan ke Edm.Double , yang berakibat hilangnya presisi pada nilai atau ukuran besar |
Edm.Double |
Edm.Int32 |
n/a |
Edm.Int64 |
Edm.Double |
Perbandingan terhadap NaN , -INF , atau INF tidak diizinkan |
Edm.Int64 |
Edm.Int64 |
n/a |
Edm.Int64 |
Edm.Int32 |
Konstanta dikonversikan Edm.Int64 sebelum dibandingkan |
Edm.Int32 |
Edm.Double |
Perbandingan terhadap NaN , -INF , atau INF tidak diizinkan |
Edm.Int32 |
Edm.Int64 |
n/a |
Edm.Int32 |
Edm.Int32 |
n/a |
Untuk perbandingan yang tidak diizinkan, seperti membandingkan bidang jenis Edm.Int64
dengan NaN
, Azure AI Search REST API akan mengembalikan kesalahan "HTTP 400: Permintaan Buruk".
Penting
Meskipun perbandingan jenis numerik bersifat fleksibel, kami sangat menyarankan untuk menulis perbandingan dalam filter agar nilai konstanta diambil dari jenis data yang sama dengan variabel atau fungsi yang sedang dibandingkan. Hal ini sangat penting saat menggabungkan titik mengambang dan nilai bilangan bulat, di mana presisi konversi implisit kemungkinan berkurang.
Kasus yang tidak biasa untuk null
dan NaN
Saat menggunakan operator perbandingan, penting untuk diingat bahwa semua bidang non-koleksi di Azure AI Search berpotensi menjadi null
. Tabel berikut menunjukkan semua kemungkinan hasil untuk ekspresi perbandingan di semua sisi mana pun dapat berupa null
:
Operator | Hasil hanya jika bidang atau variabelnya null |
Hasil hanya jika konstantanyanull |
Hasil jika bidang atau variabel dan konstantanya null |
---|---|---|---|
gt |
false |
Kesalahan HTTP 400: Permintaan Buruk | Kesalahan HTTP 400: Permintaan Buruk |
lt |
false |
Kesalahan HTTP 400: Permintaan Buruk | Kesalahan HTTP 400: Permintaan Buruk |
ge |
false |
Kesalahan HTTP 400: Permintaan Buruk | Kesalahan HTTP 400: Permintaan Buruk |
le |
false |
Kesalahan HTTP 400: Permintaan Buruk | Kesalahan HTTP 400: Permintaan Buruk |
eq |
false |
false |
true |
ne |
true |
true |
false |
Kesimpulan, null
hanya sama dengan dirinya sendiri, dan tidak kurang atau lebih besar dari nilai lainnya.
Jika indeks memiliki bidang jenis Edm.Double
dan Anda mengunggah nilai NaN
ke bidang tersebut, Anda harus mempertimbangkannya saat menulis filter. Azure AI Search mengimplementasikan standar IEEE 754 untuk menangani NaN
nilai, dan perbandingan dengan nilai tersebut menghasilkan hasil yang tidak jelas, seperti yang ditunjukkan dalam tabel berikut.
Operator | Hasil jika minimal satu operand adalah NaN |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
Kesimpulan, NaN
tidak sama dengan nilai mana pun, termasuk dirinya sendiri.
Membandingkan data geo-spasial
Anda tidak dapat langsung membandingkan bidang jenis Edm.GeographyPoint
dengan nilai konstanta, tetapi Anda dapat menggunakan fungsi geo.distance
. Fungsi ini menampilkan nilai jenis Edm.Double
, sehingga Anda dapat membandingkannya dengan konstanta angka untuk memfilter berdasarkan jarak dari koordinat geo-spasial konstanta. Lihat contoh di bawah ini.
Membandingkan data string
String dapat dibandingkan dalam filter untuk padanan yang tepat menggunakan eq
dan ne
. Perbandingan ini peka huruf besar/kecil.
Contoh
Cocokkan dokumen di mana Rating
bidang berada antara 3 dan 5, termasuk:
Rating ge 3 and Rating le 5
Mencocokkan dokumen jika bidang Location
kurang dari 2 kilometer dari garis lintang dan garis bujur tertentu:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Mencocokkan dokumen jika bidang LastRenovationDate
lebih besar atau sama dengan 1 Januari 2015, tengah malam waktu UTC:
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Mencocokkan dokumen jika bidang Details/Sku
bukan null
:
Details/Sku ne null
Mencocokkan dokumen untuk hotel jika minimal satu kamar memiliki jenis "Kamar Deluxe", jika string dari bidang Rooms/Type
cocok dengan filter secara tepat:
Rooms/any(room: room/Type eq 'Deluxe Room')