Sintaksis kueri

Kueri vektor beroperasi dengan menelusuri database vektor untuk menemukan vektor yang paling cocok dengan vektor kueri Anda di seluruh cluster. Halaman ini memberikan detail tentang cara kerjanya.

Menemukan vektor serupa

Kueri penelusuran vektor menggunakan dua strategi:

  • K-Nearest Neighbors (KNN): Menemukan k vektor terdekat dengan vektor kueri Anda.
  • Perkiraan Tetangga Terdekat (ANN): Menemukan perkiraan k vektor terdekat dengan vektor kueri Anda

Untuk menggunakan KNN, indeks harus dibuat dengan jenis indeks vektor FLAT. Dengan KNN, kueri penelusuran akan tepat, tetapi akan lebih lambat. Untuk menggunakan ANN, indeks harus dibuat dengan jenis indeks vektor HNSW. Dengan ANN, kueri penelusuran akan berupa perkiraan, tetapi akan lebih cepat. Akurasi ANN dapat ditingkatkan dengan menyesuaikan parameter indeks HNSW dan parameter EF_RUNTIME dalam kueri.

Pengelompokan sintaksis kueri

FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
  • index: Nama indeks yang berisi kolom vektor Anda.

  • (hybrid_filter_expression): Ini adalah ekspresi filter hybrid. Hanya indeks tag dan angka yang didukung dalam ekspresi filter. Lihat Kueri campuran untuk mengetahui detail selengkapnya tentang ekspresi filter.

    • (*) dapat digunakan untuk menjalankan kueri yang tidak memerlukan pemfilteran.
  • =>: Memisahkan filter dari ekspresi penelusuran vektor.

  • [KNN num_neighbours @field $vector]: Ekspresi penelusuran KNN. Ganti num_neighbors dengan jumlah hasil yang dipilih dan @field dengan nama kolom vektor Anda.

  • PARAMS 2 my_vector_query_param "query_embedding":

    • Nilai 2 setelah PARAMS menunjukkan bahwa dua argumen tambahan harus diberikan.
    • my_vector_query_param adalah nama vektor parameter kueri, seperti yang ditentukan dalam ekspresi penelusuran KNN.
    • Ganti query_embedding dengan vektor kueri sematan Anda.
  • DIALECT 2: Menentukan bahwa Anda menggunakan versi dialek kueri 2 atau yang lebih baru (diperlukan untuk penelusuran vektor).

Kueri hybrid

Ekspresi awal yang disertakan dalam tanda kurung () adalah ekspresi filter. Ekspresi filter memungkinkan Anda memfilter vektor selama eksekusi ekspresi penelusuran vektor. Kueri yang menggunakan ekspresi filter untuk memfilter hasil disebut kueri campuran. Kombinasi indeks tag dan numerik dapat membentuk kueri campuran.

Memorystore for Redis Cluster menggunakan dua pendekatan untuk memfilter ekspresi penelusuran vektor:

  1. Pra-pemfilteran: Pra-pemfilteran mengandalkan indeks sekunder (misalnya, tag, numerik) untuk menemukan kecocokan dengan ekspresi filter terlebih dahulu, terlepas dari kesamaan vektor. Setelah hasil yang difilter dihitung, penelusuran brute-force dilakukan untuk mengurutkan berdasarkan kemiripan vektor.
  2. Pemfilteran inline: Pemfilteran inline menjalankan algoritma penelusuran vektor (misalnya, HNSW), dengan mengabaikan vektor yang ditemukan yang tidak cocok dengan filter.

Pemfilteran awal lebih cepat jika ruang penelusuran yang difilter jauh lebih kecil daripada ruang penelusuran asli. Jika ruang penelusuran yang difilter besar, pemfilteran inline menjadi lebih cepat. Memorystore for Redis Cluster secara otomatis memilih antara dua strategi berdasarkan filter yang diberikan.

Ekspresi filter mendukung indeks tag dan numerik.

Indeks Tag

Tag adalah kolom teks yang ditafsirkan sebagai daftar tag yang dibatasi oleh karakter pemisah. Umumnya, tag adalah kumpulan kecil nilai dengan kemungkinan nilai terbatas seperti warna, genre buku, nama kota, atau penulis.

  • Hanya kolom yang diindeks yang dapat digunakan sebagai filter tag.
  • Kolom TAG diberi token oleh karakter pemisah, yang secara default berupa koma ",", tetapi dapat dikonfigurasi selama pembuatan indeks.
  • Tidak ada stemming yang dilakukan saat mengindeks kolom tag.
  • Hanya awalan, filter pra-pencarian yang sama persis yang dapat dilakukan pada kolom tag. Kueri akhiran, sisipan tidak didukung.
  • Secara default, tag tidak peka huruf besar/kecil. Misalnya, "Blue" dan "BLUE" akan diindeks sebagai "blue" dan akan memberikan hasil yang sama dalam kueri hibrida.
  • String kosong tidak diindeks atau dikueri.
  • Selama pengindeksan dan kueri, spasi kosong di akhir akan dihapus.
Sintaks

Di sini, { dan } adalah bagian dari sintaksis dan | digunakan sebagai operator OR untuk mendukung beberapa tag:

@:{  |  | ...}

Misalnya, kueri berikut akan menampilkan dokumen dengan warna biru ATAU hitam ATAU hijau.

@color:{blue | black | green}

Sebagai contoh lain, kueri berikut akan menampilkan dokumen yang berisi "hello world" atau "hello universe"

@color:{hello world | hello universe}

Indeks Numerik

Indeks numerik memungkinkan kueri pemfilteran hanya menampilkan nilai yang berada di antara nilai awal dan akhir tertentu.

  • Kueri inklusif dan eksklusif didukung.
  • Untuk kueri terbuka, +inf, -inf dapat digunakan untuk menyatakan rentang awal dan akhir.

Sebagai contoh, kueri berikut akan menampilkan buku yang diterbitkan antara tahun 2021 dan 2024 (inklusif). Ekspresi matematika yang setara adalah 2021 <= year <= 2024.

"@year:[2021 2024]"

Kueri berikut akan menampilkan buku yang dipublikasikan antara tahun 2021 (eksklusif) dan 2024 (inklusif). Ekspresi matematika yang setara adalah 2021 < year <= 2024.

@year:[(2021 2024]

Kueri berikut akan menampilkan buku yang diterbitkan sebelum tahun 2024 (inklusif). Ekspresi matematika yang setara adalah year <= 2024.

@year:[(-inf 2024]

Kueri berikut akan menampilkan buku yang diterbitkan setelah tahun 2015 (eksklusif). Ekspresi matematika yang setara adalah year >= 2015.

@year:[2015 +inf]

Gunakan tabel berikut sebagai panduan untuk memetakan ekspresi matematika ke kueri prapenyaringan:

Ekspresi matematika Ekspresi filter
min <= kolom <= maks @field:[min maks]
min < kolom <= maks @field:[(min max]
min <= kolom < maks @field:[min (max]
min < field < max @field:[(min (max]
field => min @field:[min +inf]
field > min @field:[(min +inf]
field <= max @field:[-inf max]
field < max @field:[-inf (max]
field == val @field:[val val]

Operator Logis

Beberapa tag dan kolom numerik dapat digunakan untuk membuat kueri kompleks menggunakan operator logis.

Logika AND

Untuk menetapkan AND logis, gunakan spasi di antara predikat. Contoh:

query1 query2 query3
OR Logis

Untuk menetapkan OR logis, gunakan karakter '|' di antara predikat. Contoh:

query1 | query2 | query3
Negasi Logis

Kueri apa pun dapat dinegasi dengan menambahkan - di depan setiap kueri. Kueri negatif menampilkan semua entri yang tidak cocok dengan kueri. Hal ini juga mencakup dokumen yang tidak memiliki kolom.

Misalnya, kueri negatif pada @genre:{comedy} akan menampilkan semua buku yang bukan komedi DAN semua buku yang tidak memiliki kolom genre.

Kueri berikut akan menampilkan semua buku bergenre "komedi" yang tidak dipublikasikan antara tahun 2015 dan 2024, atau yang tidak memiliki kolom tahun:

@genre:[comedy] -@year:[2015 2024]
Contoh Menggabungkan Operator Logika

Operator logis dapat digabungkan untuk membentuk ekspresi filter yang kompleks.

Kueri berikut akan menampilkan semua buku dengan genre "komedi" atau "horor" (AND) yang dipublikasikan antara tahun 2015 dan 2024:

@genre:[comedy|horror] @year:[2015 2024]

Kueri berikut akan menampilkan semua buku dengan genre "komedi" atau "horor" (OR) yang diterbitkan antara tahun 2015 dan 2024:

@genre:[comedy|horror] | @year:[2015 2024]

Kueri berikut akan menampilkan semua buku yang tidak memiliki kolom genre, atau memiliki kolom genre yang tidak sama dengan "komedi", yang diterbitkan antara tahun 2015 dan 2024:

-@genre:[comedy] @year:[2015 2024]

Lihat info FT.SEARCH untuk mengetahui penggunaan.