Sintaksis kueri

Kueri vektor beroperasi dengan menelusuri database vektor untuk menemukan vektor yang paling cocok dengan vektor kueri Anda. 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.
  • Approximate Nearest Neighbors (ANN): Menemukan k vektor terdekat yang diperkirakan dengan vektor kueri Anda

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

Perincian 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 numerik yang didukung dalam ekspresi filter. Lihat Kueri hybrid untuk mengetahui detail selengkapnya tentang ekspresi filter.

    • (*) dapat digunakan untuk melakukan kueri yang tidak memerlukan pemfilteran.
  • =>: Memisahkan filter dari 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 yang disematkan.
  • DIALECT 2: Menentukan bahwa Anda menggunakan dialek kueri versi 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 penelusuran vektor. Kueri yang menggunakan ekspresi filter untuk memfilter hasil disebut kueri hybrid. Kombinasi indeks tag dan numerik dapat membentuk kueri hybrid.

Memorystore for Redis menggunakan dua pendekatan untuk memfilter 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 akan dilakukan untuk mengurutkan berdasarkan kesamaan vektor.
  2. Pemfilteran inline: Pemfilteran inline menjalankan algoritma penelusuran vektor (misalnya, HNSW), dengan mengabaikan vektor yang ditemukan yang tidak cocok dengan filter.

Pra-pemfilteran lebih cepat jika ruang penelusuran yang difilter jauh lebih kecil daripada ruang penelusuran asli. Jika ruang penelusuran yang difilter besar, pemfilteran inline akan menjadi lebih cepat. Memorystore for Redis 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 nilai kecil dengan nilai yang mungkin terbatas seperti warna, genre buku, nama kota, atau penulis.

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

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 yang diberikan.

  • 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 diterbitkan 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 pra-pemfilteran:

Ekspresi matematika Ekspresi filter
min <= field <= max @field:[min max]
min < field <= max @field:[(min max]
min <= field < max @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 logika AND, gunakan spasi di antara predikat. Contoh:

query1 query2 query3
Logika OR

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

query1 | query2 | query3
Negasi Logis

Kueri apa pun dapat dinegasikan dengan menambahkan - sebelum 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 dengan genre "komedi" yang tidak diterbitkan antara tahun 2015 dan 2024, atau yang tidak memiliki kolom tahun:

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

Operator logis dapat digabungkan untuk membentuk ekspresi filter yang kompleks.

Kueri berikut akan menampilkan semua buku dengan genre "komedi" atau "horor" (AND) yang diterbitkan 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.