Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Ikhtisar pencarian vektor
Pencarian vektor dibangun di atas pembuatan, pemeliharaan, dan penggunaan indeks. Setiap operasi pencarian vektor menentukan indeks tunggal dan operasinya terbatas pada indeks itu, yaitu, operasi pada satu indeks tidak terpengaruh oleh operasi pada indeks lainnya. Kecuali untuk operasi untuk membuat dan menghancurkan indeks, sejumlah operasi dapat dikeluarkan terhadap indeks apa pun kapan saja, yang berarti bahwa pada tingkat cluster, beberapa operasi terhadap beberapa indeks dapat berlangsung secara bersamaan.
Indeks individu diberi nama objek yang ada di namespace unik, yang terpisah dari ruang OSS nama Valkey dan Redis lainnya: kunci, fungsi, dll. Setiap indeks secara konseptual mirip dengan tabel database konvensional karena terstruktur dalam dua dimensi: kolom dan baris. Setiap baris dalam tabel sesuai dengan kunci. Setiap kolom dalam indeks sesuai dengan anggota atau bagian dari kunci itu. Dalam dokumen ini, kunci istilah, baris dan catatan identik dan digunakan secara bergantian. Demikian pula istilah kolom, bidang, jalur dan anggota pada dasarnya identik dan juga digunakan secara bergantian.
Tidak ada perintah khusus untuk menambah, menghapus, atau memodifikasi data yang diindeks. Sebaliknya yang ada HASH atau JSON perintah yang memodifikasi kunci yang ada dalam indeks juga secara otomatis memperbarui indeks.
Topik
Indeks dan ruang kunci Valkey dan Redis OSS
Indeks dibangun dan dipelihara di atas subset ruang kunci Valkey dan Redis. OSS Beberapa indeks dapat memilih subset ruang kunci yang terputus atau tumpang tindih tanpa batasan. Ruang kunci untuk setiap indeks ditentukan oleh daftar awalan kunci yang disediakan saat indeks dibuat. Daftar awalan adalah opsional dan jika dihilangkan, seluruh ruang kunci akan menjadi bagian dari indeks itu. Indeks juga diketik karena hanya mencakup kunci yang memiliki tipe yang cocok. Saat ini, hanya JSON dan HASH indeks yang didukung. HASHIndeks hanya mengindeks HASH kunci yang dicakup oleh daftar awalannya dan juga JSON indeks hanya mengindeks JSON kunci yang dicakup oleh daftar awalannya. Kunci dalam daftar awalan ruang kunci indeks yang tidak memiliki tipe yang ditentukan diabaikan dan tidak memengaruhi operasi pencarian.
Ketika JSON perintah HASH atau memodifikasi kunci yang berada dalam ruang kunci indeks indeks yang diperbarui. Proses ini melibatkan penggalian bidang yang dideklarasikan untuk setiap indeks dan memperbarui indeks dengan nilai baru. Proses pembaruan dilakukan di utas latar belakang, yang berarti bahwa indeks pada akhirnya hanya konsisten dengan konten keyspace mereka. Dengan demikian sisipan atau pembaruan kunci tidak akan terlihat di hasil pencarian untuk waktu yang singkat. Selama periode beban sistem yang berat dan/atau mutasi data yang berat, penundaan visibilitas bisa menjadi lebih lama.
Pembuatan indeks adalah proses multi-langkah. Langkah pertama adalah mengeksekusi FT. CREATEperintah yang mendefinisikan indeks. Eksekusi yang berhasil membuat secara otomatis memulai langkah kedua - penimbunan ulang. Proses pengisian ulang berjalan di thread latar belakang dan memindai ruang kunci untuk kunci yang berada dalam daftar awalan indeks baru. Setiap kunci yang ditemukan ditambahkan ke indeks. Akhirnya seluruh keyspace dipindai, menyelesaikan proses pembuatan indeks. Perhatikan bahwa saat proses pengisian ulang berjalan, mutasi kunci yang diindeks diizinkan, tidak ada batasan dan proses pengisian ulang indeks tidak akan selesai sampai semua kunci diindeks dengan benar. Operasi kueri yang dicoba saat indeks sedang menjalani pengisian ulang tidak diizinkan dan diakhiri dengan kesalahan. Penyelesaian proses backfilling dapat ditentukan dari output FT.INFO
perintah untuk indeks tersebut ('backfill_status').
Jenis bidang indeks
Setiap bidang (kolom) indeks memiliki jenis tertentu yang dideklarasikan saat indeks dibuat dan lokasi di dalam kunci. Untuk HASH kunci lokasi adalah nama bidang di dalamHASH. Untuk JSON kunci lokasi adalah deskripsi JSON jalur. Ketika kunci dimodifikasi, data yang terkait dengan bidang yang dideklarasikan diekstraksi, dikonversi ke tipe yang dideklarasikan dan disimpan dalam indeks. Jika data hilang atau tidak berhasil dikonversi ke tipe yang dideklarasikan, maka bidang tersebut dihilangkan dari indeks. Ada empat jenis bidang, seperti yang dijelaskan sebagai berikut:
Bidang angka berisi satu nomor. Untuk JSON bidang, aturan numerik JSON angka harus diikuti. UntukHASH, bidang ini diharapkan berisi ASCII teks angka yang ditulis dalam format standar untuk nomor tetap atau floating point. Terlepas dari representasi dalam kunci, bidang ini dikonversi ke nomor floating point 64-bit untuk penyimpanan dalam indeks. Bidang angka dapat digunakan dengan operator pencarian rentang. Karena angka yang mendasarinya disimpan di floating point dengan batasan presisi, aturan umum tentang perbandingan numerik untuk nomor floating point berlaku.
Bidang tag berisi nol atau lebih nilai tag yang dikodekan sebagai string UTF -8 tunggal. String diuraikan menjadi nilai tag menggunakan karakter pemisah (default adalah koma tetapi dapat diganti) dengan spasi putih depan dan belakang dihapus. Sejumlah nilai tag dapat terkandung dalam satu bidang tag. Bidang tag dapat digunakan untuk memfilter kueri untuk kesetaraan nilai tag dengan perbandingan case-sensitive atau case-insensitive.
Bidang teks berisi gumpalan byte yang tidak perlu sesuai UTF -8. Bidang teks dapat digunakan untuk menghias hasil kueri dengan nilai-nilai yang bermakna aplikasi. Misalnya a URL atau isi dokumen, dll.
Bidang vektor berisi vektor angka yang juga dikenal sebagai embedding. Bidang vektor mendukung K-pencarian tetangga terdekat (KNN) dari vektor berukuran tetap menggunakan algoritma dan metrik jarak tertentu. Untuk HASH indeks, bidang harus berisi seluruh vektor yang dikodekan dalam format biner (IEEElittle-endian 754). Untuk JSON kunci, jalur harus mereferensikan array dengan ukuran yang benar yang diisi dengan angka. Perhatikan bahwa ketika JSON array digunakan sebagai bidang vektor, representasi internal array dalam JSON kunci diubah menjadi format yang diperlukan oleh algoritma yang dipilih, mengurangi konsumsi memori dan presisi. Operasi baca selanjutnya menggunakan JSON perintah akan menghasilkan nilai presisi yang berkurang.
Algoritma indeks vektor
Dua algoritma indeks vektor disediakan:
Flat — Algoritma Flat adalah pemrosesan linier brute force dari setiap vektor dalam indeks, menghasilkan jawaban yang tepat dalam batas-batas ketepatan perhitungan jarak. Karena pemrosesan linier indeks, waktu berjalan untuk algoritma ini bisa sangat tinggi untuk indeks besar.
HNSW(Hierarchical Navigable Small Worlds) — HNSW Algoritma adalah alternatif yang memberikan perkiraan jawaban yang benar dengan imbalan waktu eksekusi yang jauh lebih rendah. Algoritma dikendalikan oleh tiga parameter
M
,EF_CONSTRUCTION
danEF_RUNTIME
. Dua parameter pertama ditentukan pada waktu pembuatan indeks dan tidak dapat diubah.EF_RUNTIME
Parameter memiliki nilai default yang ditentukan pada pembuatan indeks, tetapi dapat diganti pada setiap operasi kueri individu sesudahnya. Ketiga parameter ini berinteraksi untuk menyeimbangkan memori dan CPU konsumsi selama operasi konsumsi dan kueri serta mengontrol kualitas perkiraan KNN pencarian yang tepat (dikenal sebagai rasio penarikan).
Kedua algoritma pencarian vektor (Flat danHNSW) mendukung INITIAL_CAP
parameter opsional. Ketika ditentukan, parameter ini mengalokasikan memori untuk indeks, sehingga mengurangi overhead manajemen memori dan peningkatan tingkat konsumsi vektor.
Algoritma pencarian vektor seperti HNSW mungkin tidak efisien menangani penghapusan atau penimpaan vektor yang dimasukkan sebelumnya. Penggunaan operasi ini dapat mengakibatkan and/or degraded recall quality. Reindexing is one method for restoring optimal memory usage and/or penarikan konsumsi memori indeks berlebih.
Ekspresi kueri pencarian vektor
FT. SEARCHdan FT. AGGREGATEperintah membutuhkan ekspresi kueri. Ekspresi ini adalah parameter string tunggal yang terdiri dari satu atau lebih operator. Setiap operator menggunakan satu bidang dalam indeks untuk mengidentifikasi subset kunci dalam indeks. Beberapa operator dapat digabungkan menggunakan penggabung boolean serta tanda kurung untuk lebih meningkatkan atau membatasi kumpulan kunci yang dikumpulkan (atau set hasil).
Wildcard
Operator wildcard, tanda bintang ('*'), cocok dengan semua kunci dalam indeks.
Rentang numerik
Operator rentang numerik memiliki sintaks berikut:
<range-search> ::= '@' <numeric-field-name> ':' '[' <bound> <bound> ']' <bound> ::= <number> | '(' <number> <number> ::= <integer> | <fixed-point> | <floating-point> | 'Inf' | '-Inf' | '+Inf'
< numeric-field-name > harus berupa bidang tipe yang dideklarasikanNUMERIC
. Secara default terikat bersifat inklusif tetapi tanda kurung terbuka terkemuka ['('] dapat digunakan untuk membuat eksklusif terikat. Pencarian rentang dapat dikonversi menjadi perbandingan relasional tunggal (<, <=, >, >=) dengan menggunakanInf
, +Inf
atau -Inf
sebagai salah satu batas. Terlepas dari format numerik yang ditentukan (integer, fixed-point, floating-point, infinity) jumlahnya diubah menjadi floating point 64-bit untuk melakukan perbandingan, mengurangi presisi yang sesuai.
contoh Contoh
@numeric-field:[0 10] // 0 <= <value> <= 10 @numeric-field:[(0 10] // 0 < <value> <= 10 @numeric-field:[0 (10] // 0 <= <value> < 10 @numeric-field:[(0 (10] // 0 < <value> < 10 @numeric-field:[1.5 (Inf] // 1.5 <= value
Bandingkan tag
Operator perbandingan tag memiliki sintaks berikut:
<tag-search> ::= '@' <tag-field-name> ':' '{' <tag> [ '|' <tag> ]* '}'
Jika salah satu tag di operator cocok dengan salah satu tag di bidang tag catatan, maka catatan tersebut disertakan dalam kumpulan hasil. Bidang yang dirancang oleh <tag-field-name>
harus berupa bidang indeks yang dideklarasikan dengan tipeTAG
. Contoh perbandingan tag adalah:
@tag-field:{ atag } @tag-field: { tag1 | tag2 }
Kombinasi Boolean
Kumpulan hasil operator numerik atau tag dapat digabungkan menggunakan logika boolean: and/or. Parentheses can be used to group operators and/or ubah urutan evaluasi. Sintaks operator logika boolean adalah:
<expression> ::= <phrase> | <phrase> '|' <expression> | '(' <expression> ')' <phrase> ::= <term> | <term> <phrase> <term> ::= <range-search> | <tag-search> | '*'
Beberapa istilah yang digabungkan menjadi frasa adalah “dan” -ed. Beberapa frasa yang dikombinasikan dengan pipa ('|') adalah “atau” -ed.
Pencarian vektor
Indeks vektor mendukung dua metode pencarian yang berbeda: tetangga terdekat dan jangkauan. Pencarian tetangga terdekat menemukan angka, K, dari vektor dalam indeks yang paling dekat dengan vektor (referensi) yang disediakan — ini dalam bahasa sehari-hari disebut sebagai KNN tetangga terdekat 'K'. Sintaks untuk KNN pencarian adalah:
<vector-knn-search> ::= <expression> '=>[KNN' <k> '@' <vector-field-name> '$' <parameter-name> <modifiers> ']' <modifiers> ::= [ 'EF_RUNTIME' <integer> ] [ 'AS' <distance-field-name>]
KNNPencarian vektor hanya diterapkan pada vektor yang memenuhi yang dapat berupa kombinasi dari operator <expression>
yang didefinisikan di atas: wildcard, pencarian rentang, pencarian tag dan/atau kombinasi boolean daripadanya.
<k>
adalah bilangan bulat yang menentukan jumlah vektor tetangga terdekat yang akan dikembalikan.<vector-field-name>
harus menentukan bidang tipe yang dideklarasikanVECTOR
.<parameter-name>
bidang menentukan salah satu entri untukPARAM
tabel perintahFT.SEARCH
atauFT.AGGREGATE
. Parameter ini adalah nilai vektor referensi untuk perhitungan jarak. Nilai vektor dikodekan ke dalamPARAM
nilai dalam format biner IEEE754 endian kecil (sama dikodekan seperti untuk bidang vektor) HASHUntuk jenis indeks vektorHNSW,
EF_RUNTIME
klausa opsional dapat digunakan untuk mengganti nilai defaultEF_RUNTIME
parameter yang ditetapkan saat indeks dibuat.Opsional
<distance-field-name>
memberikan nama bidang untuk kumpulan hasil yang berisi jarak yang dihitung antara vektor referensi dan kunci yang terletak.
Pencarian rentang menempatkan semua vektor dalam jarak tertentu (radius) dari vektor referensi. Sintaks untuk pencarian rentang adalah:
<vector-range-search> ::= ‘@’ <vector-field-name> ‘:’ ‘[’ ‘VECTOR_RANGE’ ( <radius> | ‘$’ <radius-parameter> ) $<reference-vector-parameter> ‘]’ [ ‘=’ ‘>’ ‘{’ <modifiers> ‘}’ ] <modifiers> ::= <modifier> | <modifiers>, <modifier> <modifer> ::= [ ‘$yield_distance_as’ ‘:’ <distance-field-name> ] [ ‘$epsilon’ ‘:’ <epsilon-value> ]
Di mana:
<vector-field-name>
adalah nama bidang vektor yang akan dicari.<radius> or $<radius-parameter>
adalah batas jarak numerik untuk pencarian.$<reference-vector-parameter>
adalah nama parameter yang berisi vektor referensi. Nilai vektor dikodekan ke dalam PARAM nilai dalam format biner IEEE 754 endian kecil (pengkodean yang sama seperti untuk bidang vektor) HASHOpsional
<distance-field-name>
memberikan nama bidang untuk kumpulan hasil yang berisi jarak yang dihitung antara vektor referensi dan setiap tombol.Opsional
<epsilon-value>
mengontrol batas operasi pencarian, vektor dalam jarak dilalui<radius> * (1.0 + <epsilon-value>)
mencari hasil kandidat. Defaultnya adalah .01.
INFOperintah
Pencarian vektor menambah OSS INFOSEARCH
akan mengambil semua bagian berikut:
Bagian search_memory
Nama | Penjelasan |
---|---|
search_used_memory_bytes | Jumlah byte memori yang dikonsumsi di semua struktur data pencarian |
search_used_memory_human | Versi yang dapat dibaca manusia di atas |
Bagian search_index_stats
Nama | Penjelasan |
---|---|
search_number_of_indexes | Jumlah indeks yang dibuat |
search_num_fulltext_indexes | Jumlah bidang non-vektor di semua indeks |
search_num_vector_indexes | Jumlah bidang vektor di semua indeks |
search_num_hash_indexes | Jumlah indeks pada tombol HASH tipe |
search_num_json_indexes | Jumlah indeks pada tombol JSON tipe |
search_total_indexed_keys | Jumlah total kunci di semua indeks |
search_total_indexed_vectors | Jumlah total vektor di semua indeks |
search_total_indexed_hash_keys | Jumlah total kunci tipe HASH di semua indeks |
search_total_indexed_json_keys | Jumlah total kunci tytpe JSON di semua indeks |
search_total_index_size | Byte yang digunakan oleh semua indeks |
search_total_fulltext_index_size | Byte yang digunakan oleh struktur indeks non-vektor |
search_total_vector_index_size | Byte yang digunakan oleh struktur indeks vektor |
search_max_index_lag_ms | Penundaan konsumsi selama pembaruan batch konsumsi terakhir |
Bagian search_ingestion
Nama | Penjelasan |
---|---|
search_background_indexing_status | Status konsumsi. NO_ACTIVITY berarti menganggur. Nilai lain menunjukkan ada kunci dalam proses dicerna. |
search_ingestion_dijeda | Kecuali saat memulai ulang, ini harus selalu “tidak”. |
Bagian search_backfill
catatan
Beberapa bidang yang didokumentasikan di bagian ini hanya terlihat saat pengisian ulang sedang berlangsung.
Nama | Penjelasan |
---|---|
search_num_active_backfills | Jumlah kegiatan pengurukan saat ini |
search_backfills_dijeda | Kecuali ketika kehabisan ingatan, ini harus selalu “tidak”. |
search_current_backfill_progress_percentage | % penyelesaian (0-100) dari isi ulang saat ini |
Bagian search_query
Nama | Penjelasan |
---|---|
search_num_active_queries | Jumlah FT.SEARCH dan FT.AGGREGATE perintah yang sedang berlangsung |
Keamanan pencarian vektor
ACL(Daftar Kontrol Akses)@search
, disediakan dan banyak kategori yang ada (@fast
,,@read
,@write
, dll.) Diperbarui untuk menyertakan perintah baru. Perintah pencarian tidak memodifikasi data kunci, artinya ACL mesin yang ada untuk akses tulis dipertahankan. Aturan akses untuk HASH dan JSON operasi tidak dimodifikasi oleh kehadiran indeks; kontrol akses tingkat kunci normal masih diterapkan pada perintah tersebut.
Perintah pencarian dengan indeks juga memiliki akses mereka dikendalikan melaluiACL. Pemeriksaan akses dilakukan pada tingkat seluruh indeks, bukan pada tingkat per-kunci. Ini berarti bahwa akses ke indeks diberikan kepada pengguna hanya jika pengguna tersebut memiliki izin untuk mengakses semua kunci yang mungkin dalam daftar awalan keyspace indeks tersebut. Dengan kata lain, konten sebenarnya dari indeks tidak mengontrol akses. Sebaliknya, itu adalah isi teoritis dari indeks seperti yang didefinisikan oleh daftar awalan yang digunakan untuk pemeriksaan keamanan. Hal ini dapat mudah untuk membuat situasi di mana pengguna telah membaca dan/atau menulis akses ke kunci tetapi tidak dapat mengakses indeks yang berisi kunci itu. Perhatikan bahwa hanya akses baca ke ruang kunci yang diperlukan untuk membuat atau menggunakan indeks - ada atau tidak adanya akses tulis tidak dipertimbangkan.
Untuk informasi selengkapnya tentang penggunaan ACLs dengan MemoryDB, lihat Mengautentikasi pengguna dengan Daftar Kontrol Akses (). ACLs