Halaman ini memberikan ringkasan penelusuran vektor yang difilter di AlloyDB untuk PostgreSQL.
Penelusuran vektor yang difilter terdiri dari vektor kueri dan filter untuk kolom tertentu. AlloyDB menggunakan kemampuan kueri yang kaya dari PostgreSQL, sehingga Anda dapat melakukan penelusuran vektor dan mengkueri data terstruktur dan tidak terstruktur dari satu antarmuka SQL.
Opsi pemfilteran
Pengoptimal kueri AlloyDB memainkan peran penting dalam menentukan strategi pemfilteran yang paling efisien untuk penelusuran vektor Anda.
Untuk memperkirakan biaya berbagai rencana eksekusi, pengoptimal kueri menganalisis kueri Anda dan mempertimbangkan faktor-faktor seperti selektifitas filter, distribusi data, dan ketersediaan indeks.
Berdasarkan estimasi biaya, pengoptimal memilih strategi pemfilteran yang optimal dari opsi berikut:
Pra-pemfilteran
Pra-pemfilteran adalah strategi pengoptimalan kueri yang menggunakan filter Anda untuk menemukan grup item yang lebih kecil yang cocok dengan kriteria Anda, bukan menelusuri seluruh set data. Kemudian, AlloyDB menjalankan penelusuran vektor pada grup yang lebih kecil tersebut.
Misalnya, jika Anda mencari kemeja biru yang serupa, AlloyDB akan menemukan semua kemeja biru terlebih dahulu, lalu menelusuri item serupa dalam grup tersebut.
Strategi ini meningkatkan performa karena menjalankan penelusuran kesamaan vektor yang intensif komputasi pada set data yang dikurangi.
Pasca-pemfilteran
Pemfilteran pasca-filter adalah strategi yang digunakan AlloyDB saat filter Anda tidak mempersempit hasil secara signifikan. Alih-alih memfilter terlebih dahulu, AlloyDB memulai dengan menemukan daftar luas item serupa berdasarkan penelusuran vektor Anda. Kemudian, filter akan memeriksa hasil berdasarkan kondisi filter Anda untuk membuat daftar akhir.
Misalnya, jika Anda menelusuri film serupa dan memiliki filter yang sangat luas seperti genre = drama
, AlloyDB akan terlebih dahulu menemukan kumpulan besar film yang mirip dengan penelusuran Anda, lalu memfilternya menurut genre karena sebagian besar film mungkin adalah drama.
Strategi ini efisien jika Anda mengharapkan banyak hasil yang cocok dengan filter Anda.
Pemfilteran inline
Pemfilteran inline adalah strategi pengoptimalan kueri saat AlloyDB menggunakan vektor dan indeks sekunder lainnya untuk melakukan penelusuran vektor dan evaluasi filter secara bersamaan. AlloyDB menelusuri indeks vektor untuk menemukan vektor yang 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 menurut color = black
, pemfilteran inline berarti AlloyDB hanya memeriksa kesamaan sepatu yang sudah berwarna hitam. Cara ini lebih efisien daripada memeriksa kesamaan semua sepatu, lalu memfilter menurut warna, atau memfilter semua sepatu menurut warna, lalu memeriksa kesamaan.
Pemfilteran inline sangat efektif jika filter mempersempit hasil secara moderat.
Memahami rencana kueri
Rencana kueri memberikan tampilan komprehensif tentang 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 rencana Pemindaian Kustom, yang juga dikenal sebagai pemindaian vektor, yang mengandalkan node rencana Pemindaian Indeks Bitmap untuk menyediakan bitmap bagi klausa filter.
Pemindaian vektor menghitung jarak hanya 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 rencana 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 rencana kueri, Limit (actual rows=10)
menunjukkan bahwa kueri menggunakan klausa LIMIT 10;
SQL 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 rencana 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 pendek baris tempat penelusuran kesamaan perlu dilakukan. 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
merujuk ke 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 di 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.