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 kerja hal ini.
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 ke 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 menjadi 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 campuran. Hanya tag dan indeks numerik 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 penelusuran vektor.[KNN num_neighbours @field $vector]
: Ekspresi penelusuran KNN. Gantinum_neighbors
dengan jumlah hasil yang dipilih dan@field
dengan nama kolom vektor Anda.PARAMS 2 my_vector_query_param "query_embedding"
:- Nilai
2
setelahPARAMS
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 tersemat Anda.
- Nilai
DIALECT 2
: Menentukan bahwa Anda menggunakan dialek kueri versi 2 atau yang lebih baru (diperlukan untuk penelusuran vektor).
Kueri campuran
Ekspresi awal yang diapit 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 campuran. Kombinasi indeks tag dan numerik dapat membentuk kueri campuran.
Memorystore for Valkey menggunakan dua pendekatan untuk memfilter penelusuran vektor:
- 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 kemiripan vektor.
- 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 Valkey akan otomatis memilih antara kedua strategi tersebut berdasarkan filter yang diberikan.
Ekspresi filter mendukung indeks tag dan numerik.
Indeks Tag
Tag adalah kolom teks yang ditafsirkan sebagai daftar tag yang dipisahkan oleh karakter pemisah. Umumnya, tag adalah kumpulan kecil nilai dengan kemungkinan nilai yang 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, yaitu koma "," secara default, tetapi dapat dikonfigurasi selama pembuatan indeks.
- Tidak ada stemming yang dilakukan saat mengindeks kolom tag.
- Hanya awalan, filter pra-pencocokan persis yang dapat dilakukan di kolom tag. Kueri akhiran, 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 campuran.
- 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 untuk 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 dipublikasikan antara tahun 2021 dan 2024 (Keduanya 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 dipublikasikan sebelum tahun 2024 (inklusif). Ekspresi matematika yang setara adalah year <= 2024
.
@year:[(-inf 2024]
Kueri berikut akan menampilkan buku yang dipublikasikan 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 prapemfilteran:
Ekspresi matematika | Ekspresi filter |
---|---|
min <= kolom <= maks | @field:[min max] |
min < kolom <= maks | @field:[(min max] |
min <= kolom < maks | @field:[min (max] |
min < kolom < maks | @field:[(min (max] |
kolom => min | @field:[min +inf] |
kolom > min | @field:[(min +inf] |
kolom <= maks | @field:[-inf max] |
kolom < maks | @field:[-inf (max] |
kolom == 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
Logika OR
Untuk menetapkan OR logis, gunakan karakter '|' di antara predikat. Contoh:
query1 | query2 | query3
Negasi Logis
Setiap kueri dapat dinegasikan dengan menambahkan -
di awal setiap kueri. Kueri negatif menampilkan semua entri yang tidak cocok dengan kueri. Hal ini juga mencakup dokumen yang tidak memiliki kolom.
Misalnya, kueri negatif di @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 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" (ATAU) 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 dipublikasikan antara tahun 2015 dan 2024:
-@genre:[comedy] @year:[2015 2024]
Lihat info FT.SEARCH untuk penggunaan.