Ikhtisar pencarian vektor - Amazon MemoryDB

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.

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 parameterM, EF_CONSTRUCTION danEF_RUNTIME. Dua parameter pertama ditentukan pada waktu pembuatan indeks dan tidak dapat diubah. EF_RUNTIMEParameter 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.

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 untuk PARAM tabel perintah FT.SEARCH atauFT.AGGREGATE. Parameter ini adalah nilai vektor referensi untuk perhitungan jarak. Nilai vektor dikodekan ke dalam PARAM nilai dalam format biner IEEE754 endian kecil (sama dikodekan seperti untuk bidang vektor) HASH

  • Untuk jenis indeks vektorHNSW, EF_RUNTIME klausa opsional dapat digunakan untuk mengganti nilai default EF_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) HASH

  • Opsional <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 INFOperintah Valkey dan Redis dengan beberapa bagian statistik dan penghitung tambahan. Permintaan untuk mengambil bagian SEARCH 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_ACTIVITYberarti 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) mekanisme keamanan untuk perintah dan akses data diperluas untuk mengontrol fasilitas pencarian. ACLkontrol perintah pencarian individu sepenuhnya didukung. ACLKategori baru,@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