Operator perbandingan OData di Azure AI Search - eq, , ne, ltgt, 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 konstanta
  • ne: Uji apakah bidang tidak setara dengan nilai konstanta

Operator rentang:

  • gt: Uji apakah bidang lebih besar dari nilai konstanta
  • lt: Uji apakah bidang lebih kecil dari nilai konstanta
  • ge: Uji apakah bidang lebih besar dari atau setara dengan nilai konstanta
  • le: 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')

Langkah berikutnya