Penelusuran vektor yang difilter di AlloyDB untuk PostgreSQL memungkinkan Anda menggabungkan penelusuran kemiripan vektor dengan filter SQL terstruktur dalam satu kueri. Dengan memasangkan vektor kueri dengan predikat metadata, Anda dapat mempersempit hasil kemiripan ke subset data yang cocok, sementara pengoptimal kueri AlloyDB otomatis memilih strategi pemfilteran yang paling efisien.
Opsi pemfilteran
Pengoptimal kueri AlloyDB memainkan peran penting dalam menentukan strategi pemfilteran yang paling efisien untuk penelusuran vektor Anda.
Untuk memperkirakan biaya paket eksekusi yang berbeda, pengoptimal kueri menganalisis kueri Anda dan mempertimbangkan faktor-faktor seperti selektivitas filter, distribusi data, dan ketersediaan indeks.
Berdasarkan estimasi biaya, pengoptimal memilih strategi pemfilteran yang optimal dari yang berikut:
Pemfilteran di awal
Pemfilteran di awal adalah strategi pengoptimalan kueri tempat AlloyDB menggunakan filter Anda untuk menemukan sekelompok kecil item yang cocok dengan kriteria Anda, bukan menelusuri seluruh set data. Kemudian, AlloyDB menjalankan penelusuran vektor pada kelompok yang lebih kecil tersebut.
Misalnya, jika Anda mencari kemeja biru yang serupa, AlloyDB akan menemukan semua kemeja biru terlebih dahulu, lalu mencari item serupa dalam grup tersebut.
Strategi ini meningkatkan performa karena menjalankan penelusuran kemiripan vektor yang intensif secara komputasi pada set data yang dikurangi.
Pemfilteran pascaproses
Pemfilteran pascaproses adalah strategi yang digunakan AlloyDB saat filter Anda tidak mempersempit hasil secara signifikan. Alih-alih memfilter terlebih dahulu, AlloyDB mulai dengan menemukan daftar item serupa yang luas berdasarkan penelusuran vektor Anda. Kemudian, AlloyDB memeriksa hasil terhadap kondisi filter Anda untuk membuat daftar akhir.
Misalnya, jika Anda menelusuri film serupa dan memiliki filter yang sangat luas seperti genre = drama, AlloyDB akan menemukan kumpulan besar film yang serupa dengan penelusuran Anda terlebih dahulu, lalu memfilternya berdasarkan genre karena sebagian besar film mungkin bergenre drama.
Strategi ini efisien jika Anda mengharapkan banyak hasil yang cocok dengan filter Anda.
Pemfilteran inline
Pemfilteran inline adalah strategi pengoptimalan kueri tempat AlloyDB menggunakan indeks vektor dan indeks sekunder lainnya untuk melakukan Penelusuran Vektor dan evaluasi filter secara bersamaan. AlloyDB menelusuri indeks vektor untuk menemukan vektor serupa dan juga memeriksa apakah setiap vektor cocok dengan kondisi filter metadata Anda, dengan memanfaatkan indeks seperti B-tree, GIN, atau GiST untuk evaluasi cepat kondisi ini.
Misalnya, jika Anda menelusuri sepatu serupa dan memfilter berdasarkan color = black, pemfilteran inline berarti AlloyDB hanya memeriksa kemiripan sepatu yang sudah berwarna hitam. Hal ini lebih efisien daripada memeriksa kemiripan semua sepatu, lalu memfilter berdasarkan warna, atau memfilter semua sepatu berdasarkan warna, lalu memeriksa kemiripan.
Pemfilteran inline unggul saat filter mempersempit hasil secara moderat.
Memahami rencana kueri
Paket kueri memberikan tampilan komprehensif dari proses eksekusi kueri dan menunjukkan strategi pemfilteran yang dipilih AlloyDB untuk operasi pemindaian vektor di kolom Execution Strategy.
Rencana kueri untuk pemfilteran inline
Untuk pemfilteran inline, AlloyDB menggunakan node paket Pemindaian Kustom, yang juga dikenal sebagai pemindaian vektor, yang mengandalkan node paket Pemindaian Indeks Bitmap untuk menyediakan bitmap untuk klausa filter.
Pemindaian vektor hanya menghitung jarak untuk baris yang memenuhi kriteria filter.
Kueri berikut menunjukkan pemfilteran inline untuk penelusuran shoes yang difilter menurut color = black
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
Contoh paket kueri berikut menggambarkan penelusuran vektor yang dioptimalkan menggunakan pemfilteran inline:
Limit (actual rows=10)
-> Custom Scan (vector scan) on products
Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
Order By: (embedding <=> '[...]')::vector)
Limit: 10
-> Bitmap Index Scan on products (color_index)
Index Cond: (color = 'black')
Dalam contoh paket kueri, Limit (actual rows=10) menunjukkan bahwa kueri menggunakan klausa SQL LIMIT 10; untuk membatasi output. actual rows=10 berarti node ini menampilkan 10 baris selama eksekusi kueri.
Node -> Custom Scan (vector scan) on products mewakili operasi penelusuran vektor. Ini adalah Pemindaian Kustom karena merupakan pemindaian khusus untuk data vektor, dan beroperasi pada tabel products.
Contoh paket kueri untuk pemfilteran inline menampilkan Bitmap assisted vector Scan on products_embedding_index di kolom Execution Strategy, yang menunjukkan bahwa pemindaian vektor menggunakan bitmap untuk membuat daftar singkat baris yang harus dilakukan penelusuran kemiripan. Pemindaian indeks bitmap digunakan untuk memfilter data berdasarkan kondisi color = 'black'.
Atribut Order By: (embedding <=> '[...]')::vector menunjukkan bahwa hasil diurutkan berdasarkan kemiripan vektor, yang dihitung menggunakan ekspresi (embedding <=> '[...]')::vector, dengan embedding mengacu pada kolom vektor, <=> mewakili operator tetangga terdekat, [...] adalah vektor kueri, dan ::vector melakukan transmisi jenis ke jenis data vektor.
Node -> Bitmap Index Scan on products (color_index) mewakili pemindaian indeks bitmap pada colors_index. Pemindaian indeks bitmap memilih baris yang cocok dengan kondisi filter menggunakan bitmap, dan menggunakan color_index untuk pemfilteran.
Atribut Index Cond: (color = 'black') menentukan kondisi filter yang digunakan oleh pemindaian indeks color = 'black' dari klausa WHERE kueri.
Praktik terbaik untuk penelusuran vektor yang difilter
Jika kueri penelusuran vektor Anda menyertakan filter, sebaiknya buat indeks B-tree pada kolom yang digunakan dalam filter tersebut, terlepas dari apakah Anda menggunakan indeks vektor ScaNN, HNSW, atau IVFFlat.