Operator Dasar

Milvus menyediakan serangkaian operator dasar yang lengkap untuk membantu Anda menyaring dan melakukan kueri data secara efisien. Operator-operator ini memungkinkan Anda menyempurnakan kondisi pencarian berdasarkan bidang skalar, perhitungan numerik, kondisi logis, dan lainnya. Memahami cara menggunakan operator-operator ini sangat penting untuk membuat kueri yang tepat dan memaksimalkan efisiensi pencarian Anda.

Operator perbandingan

Operator perbandingan digunakan untuk menyaring data berdasarkan kesamaan, ketidaksamaan, atau ukuran. Operator ini dapat diterapkan pada bidang numerik dan teks.

Operator perbandingan yang didukung

  • == (Sama dengan)

  • != (Tidak sama dengan)

  • > (Lebih besar dari)

  • < (Lebih kecil dari)

  • >= (Lebih besar dari atau sama dengan)

  • <= (Kurang dari atau sama dengan)

Contoh 1: Penyaringan dengan operator sama dengan (==)

Misalkan Anda memiliki bidang bernama status dan ingin mencari semua entitas di mana status bernilai "active". Anda dapat menggunakan operator kesamaan ==:

filter = 'status == "active"'

Contoh 2: Penyaringan dengan operator "tidak sama dengan" (!=)

Untuk mencari entitas di mana status bukan "inactive":

filter = 'status != "inactive"'

Contoh 3: Penyaringan dengan "lebih besar dari" (>)

Jika Anda ingin mencari semua entitas dengan age lebih besar dari 30:

filter = 'age > 30'

Contoh 4: Penyaringan dengan "kurang dari"

Untuk menemukan entitas di mana price kurang dari 100:

filter = 'price < 100'

Contoh 5: Penyaringan dengan lebih besar dari atau sama dengan (>=)

Jika Anda ingin mencari semua entitas dengan nilai rating yang lebih besar dari atau sama dengan 4:

filter = 'rating >= 4'

Contoh 6: Penyaringan dengan kurang dari atau sama dengan

Untuk menemukan entitas dengan discount kurang dari atau sama dengan 10%:

filter = 'discount <= 10'

Operator rentang

Operator rentang membantu menyaring data berdasarkan sekumpulan nilai tertentu. Milvus mendukung IN untuk pemeriksaan keanggotaan himpunan.

Jika Anda ingin menemukan semua entitas yang " color "-nya adalah "merah", "hijau", atau "biru":

filter = 'color in ["red", "green", "blue"]'

Ini berguna saat Anda ingin memeriksa keanggotaan dalam daftar nilai.

Operator pencocokan pola

Operator pencocokan pola membantu menyaring nilai string berdasarkan pola wildcard atau ekspresi reguler.

  • LIKE: Digunakan untuk mencocokkan pola karakter pengganti sederhana pada nilai string. Misalnya, name LIKE "Prod%" mencocokkan nilai yang dimulai dengan Prod.

  • =~: Digunakan untuk mencocokkan nilai string dengan ekspresi reguler RE2. Misalnya, code =~ "E[0-9]{4}" mencocokkan nilai yang mengandung kode kesalahan seperti E1001.

  • !~: Digunakan untuk mengecualikan nilai string yang cocok dengan ekspresi reguler RE2. Ini setara dengan NOT (field =~ "pattern").

Untuk menemukan entitas di mana name dimulai dengan Prod:

filter = 'name LIKE "Prod%"'

Untuk menemukan entitas yang code -nya berisi kode kesalahan seperti E1001:

filter = 'code =~ "E[0-9]{4}"'

Untuk mengecualikan entitas yang message -nya dimulai dengan DEBUG:

filter = 'message !~ "^DEBUG"'

Untuk detail lebih lanjut tentang memilih antara LIKE dan regex, jenis bidang yang didukung, sintaks regex, aturan escaping, dan kinerja, lihat Pencocokan Pola. Milvus juga memungkinkan Anda membuat indeks NGRAM pada bidang VARCHAR atau jalur string JSON untuk mempercepat filter pencocokan pola yang memenuhi syarat. Untuk detailnya, lihat NGRAM.

Operator aritmatika

Operator aritmatika memungkinkan Anda membuat kondisi berdasarkan perhitungan yang melibatkan bidang numerik.

Operator aritmatika yang didukung

  • + (Penjumlahan)

  • - (Pengurangan)

  • * (Perkalian)

  • / (Pembagian)

  • % (Modulus)

  • ** (Pangkat)

Contoh 1: Menggunakan modulus (%)

Untuk mencari bilangan di mana id adalah bilangan genap (yaitu, habis dibagi 2):

filter = 'id % 2 == 0'

Contoh 2: Menggunakan pangkat (**)

Untuk mencari bilangan di mana price dipangkatkan dengan 2 hasilnya lebih besar dari 1000:

filter = 'price ** 2 > 1000'

Operator bitwiseCompatible with Milvus 3.0.0+

Operator bitwise berguna ketika bidang bilangan bulat mengkodekan beberapa flag, seperti izin, flag fitur, atau bit status. Anda dapat menggunakan operator ini dalam ekspresi filter untuk memeriksa, menggabungkan, atau membandingkan bit individual dalam nilai bilangan bulat.

Untuk bidang skalar, operator bitwise berlaku untuk tipe bidang bilangan bulat, seperti INT8, INT16, INT32, dan INT64.

Operator bitwise yang didukung

OperatorNamaPenggunaan umum
&AND bitwiseMemeriksa apakah bit tertentu disetel.
|OR bitwiseMenggabungkan bit sebelum perbandingan.
^XOR bitBandingkan perbedaan bit antara dua nilai.

Contoh: Penyaringan berdasarkan bit izin

Asumsikan Anda memiliki bidang bilangan bulat bernama ` permissions`, dan setiap bit dalam bilangan bulat tersebut mewakili bendera izin:

Bendera izinNilai bit
READ1
WRITE2
SHARE4
ADMIN8

Misalnya, permissions = 5 berarti bit READ dan SHARE disetel, karena 5 = 1 + 4.

Untuk menemukan entitas di mana bit ` SHARE ` disetel, gunakan operasi bitwise AND (`&`):

filter = "(permissions & 4) == 4"

Untuk menemukan entitas di mana pengaturan bit ` WRITE ` menghasilkan set izin ` READ + WRITE + SHARE `, gunakan operasi bitwise OR (|):

filter = "(permissions | 2) == 7"

Untuk menemukan entitas yang bit izinnya berbeda dari READ + WRITE + SHARE hanya pada bit WRITE, gunakan operasi bitwise XOR (^):

filter = "(permissions ^ 7) == 2"

Selalu letakkan operasi bitwise di dalam tanda kurung sebelum membandingkan hasilnya, seperti (permissions & 4) == 4. Milvus 3.0.0 mendukung &, |, dan ^ dalam ekspresi filter. Operator bitwise NOT (~) dan operator pergeseran (<< dan >>) tidak didukung.

Operator logika

Operator logika digunakan untuk menggabungkan beberapa kondisi menjadi ekspresi filter yang lebih kompleks. Operator ini meliputi AND, OR, dan NOT.

Operator logika yang didukung

  • AND: Menggabungkan beberapa kondisi yang semuanya harus benar.

  • OR: Menggabungkan kondisi di mana setidaknya satu di antaranya harus benar.

  • NOT: Menafikan suatu kondisi.

Contoh 1: Menggunakan AND untuk menggabungkan kondisi

Untuk menemukan semua produk di mana " price " lebih besar dari 100 dan " stock " lebih besar dari 50:

filter = 'price > 100 AND stock > 50'

Contoh 2: Menggunakan " OR " untuk menggabungkan kondisi

Untuk mencari semua produk yang memiliki nilai " color " berwarna "merah" atau "biru":

filter = 'color == "red" OR color == "blue"'

Contoh 3: Menggunakan NOT untuk mengecualikan suatu kondisi

Untuk mencari semua produk di mana color bukan "green":

filter = 'NOT color == "green"'

Operator IS NULL dan IS NOT NULL

Operator IS NULL dan IS NOT NULL digunakan untuk menyaring bidang berdasarkan apakah bidang tersebut berisi nilai null (tidak ada data).

  • IS NULL: Mengidentifikasi entitas di mana bidang tertentu berisi nilai null, yaitu nilai tersebut tidak ada atau tidak terdefinisi.

  • IS NOT NULL: Mengidentifikasi entitas di mana bidang tertentu berisi nilai apa pun selain null, artinya bidang tersebut memiliki nilai yang valid dan terdefinisi.

Operator-operator ini tidak membedakan huruf besar-kecil, sehingga Anda dapat menggunakan IS NULL atau is null, serta IS NOT NULL atau is not null.

Bidang skalar biasa dengan nilai null

Milvus memungkinkan penyaringan pada bidang skalar biasa, seperti string atau angka, yang memiliki nilai null.

String kosong "" tidak dianggap sebagai nilai null untuk bidang VARCHAR.

Untuk mengambil entitas di mana bidang description bernilai null:

filter = 'description IS NULL'

Untuk mengambil entitas di mana bidang ` description ` tidak bernilai `null`:

filter = 'description IS NOT NULL'

Untuk mengambil entitas di mana bidang ` description ` tidak bernilai `null` dan bidang ` price ` lebih besar dari 10:

filter = 'description IS NOT NULL AND price > 10'

Kolom JSON dengan nilai null

Milvus memungkinkan penyaringan pada bidang JSON yang berisi nilai null. Sebuah bidang JSON dianggap null dalam kasus-kasus berikut:

  • Seluruh objek JSON secara eksplisit ditetapkan ke None (null), misalnya, {"metadata": None}.

  • Bidang JSON itu sendiri sama sekali tidak ada dalam entitas.

Jika beberapa elemen dalam objek JSON bernilai null (misalnya, kunci individu), bidang tersebut tetap dianggap tidak null. Misalnya, \{"metadata": \{"category": None, "price": 99.99}} tidak dianggap null, meskipun kunci category bernilai null.

Untuk lebih menggambarkan bagaimana Milvus menangani bidang JSON dengan nilai null, perhatikan data contoh berikut dengan bidang JSON metadata:

data = [
  {
      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "metadata": None, # Entire JSON object is null
      "pk": 2,
      "embedding": [0.56, 0.78, 0.90]
  },
  {  # JSON field `metadata` is completely missing
      "pk": 3,
      "embedding": [0.91, 0.18, 0.23]
  },
  {
      "metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
      "pk": 4,
      "embedding": [0.56, 0.38, 0.21]
  }
]

Contoh 1: Mengambil entitas yang metadata-nya bernilai null

Untuk menemukan entitas di mana bidang metadata tidak ada atau secara eksplisit ditetapkan ke None:

filter = 'metadata IS NULL'

# Example output:
# data: [
#     "{'metadata': None, 'pk': 2}",
#     "{'metadata': None, 'pk': 3}"
# ]

Contoh 2: Mengambil entitas di mana metadata tidak bernilai null

Untuk menemukan entitas di mana bidang ` metadata ` tidak bernilai `null`:

filter = 'metadata IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

Bidang ARRAY dengan nilai null

Milvus memungkinkan penyaringan pada bidang ARRAY yang berisi nilai null. Sebuah bidang ARRAY dianggap null dalam kasus-kasus berikut:

  • Seluruh bidang ARRAY secara eksplisit ditetapkan ke None (null), misalnya, "tags": None.

  • Bidang ARRAY sama sekali tidak ada dalam entitas.

Sebuah bidang ARRAY tidak dapat berisi nilai null parsial karena semua elemen dalam bidang ARRAY harus memiliki tipe data yang sama. Untuk detailnya, lihat Bidang ARRAY.

Untuk lebih menggambarkan bagaimana Milvus menangani bidang ARRAY dengan nilai null, perhatikan data contoh berikut dengan bidang ARRAY tags:

data = [
  {
      "tags": ["pop", "rock", "classic"],
      "ratings": [5, 4, 3],
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "tags": None,  # Entire ARRAY is null
      "ratings": [4, 5],
      "pk": 2,
      "embedding": [0.78, 0.91, 0.23]
  },
  {  # The tags field is completely missing
      "ratings": [9, 5],
      "pk": 3,
      "embedding": [0.18, 0.11, 0.23]
  }
]

Contoh 1: Mengambil entitas di mana `tags` bernilai null

Untuk mengambil entitas di mana bidang ` tags ` tidak ada atau secara eksplisit ditetapkan bernilai ` None`:

filter = 'tags IS NULL'

# Example output:
# data: [
#     "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
#     "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]

Contoh 2: Mengambil entitas di mana `tags` tidak bernilai `null`

Untuk mengambil entitas di mana bidang ` tags ` tidak bernilai `null`:

filter = 'tags IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

Tips penggunaan operator dasar dengan bidang JSON dan ARRAY

Meskipun operator dasar di Milvus serbaguna dan dapat diterapkan pada bidang skalar, operator tersebut juga dapat digunakan secara efektif dengan kunci dan indeks di bidang JSON dan ARRAY.

Misalnya, jika Anda memiliki bidang ` product ` yang berisi beberapa kunci seperti ` price`, ` model`, dan ` tags`, selalu rujuk kunci tersebut secara langsung:

filter = 'product["price"] > 1000'

Untuk menemukan catatan di mana suhu pertama dalam array suhu yang tercatat melebihi nilai tertentu, gunakan:

filter = 'history_temperatures[0] > 30'

Kesimpulan

Milvus menawarkan berbagai operator dasar yang memberi Anda fleksibilitas dalam memfilter dan menanyakan data Anda. Dengan menggabungkan operator perbandingan, rentang, aritmatika, dan logika, Anda dapat membuat ekspresi filter yang kuat untuk mempersempit hasil pencarian dan mengambil data yang Anda butuhkan secara efisien.

Pertanyaan Umum

Apakah ada batasan panjang daftar nilai pencocokan dalam kondisi filter (misalnya, filter=’color in ["red", "green", “blue”]')? Apa yang harus saya lakukan jika daftarnya terlalu panjang?

Zilliz Cloud tidak memberlakukan batasan panjang pada daftar nilai pencocokan dalam kondisi filter. Namun, daftar yang terlalu panjang dapat berdampak signifikan terhadap kinerja kueri. Jika kondisi filter Anda mencakup daftar nilai pencocokan yang panjang atau ekspresi kompleks dengan banyak elemen, kami menyarankan penggunaan Filter Templating untuk meningkatkan kinerja kueri.