Penelusuran vektor yang difilter terdiri dari vektor kueri dan filter untuk kolom tertentu. AlloyDB Omni menggunakan kemampuan kueri PostgreSQL yang kaya, sehingga Anda dapat melakukan penelusuran vektor dan membuat kueri data terstruktur dan tidak terstruktur dari satu antarmuka SQL.
Opsi pemfilteran
Pengoptimal kueri AlloyDB Omni 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:
Pra-pemfilteran
Pra-pemfilteran adalah strategi pengoptimalan kueri yang menggunakan filter Anda untuk menemukan sekelompok kecil item yang cocok dengan kriteria Anda, bukan menelusuri seluruh set data. Kemudian, AlloyDB Omni menjalankan penelusuran vektor pada kelompok yang lebih kecil tersebut.
Misalnya, jika Anda mencari kemeja biru yang serupa, AlloyDB Omni 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 secara komputasi pada set data yang dikurangi.
Pasca-pemfilteran
Pasca-pemfilteran adalah strategi yang digunakan AlloyDB Omni saat filter Anda tidak mempersempit hasil secara signifikan. Daripada memfilter terlebih dahulu, AlloyDB Omni mulai dengan menemukan daftar item serupa yang luas berdasarkan penelusuran vektor Anda. Kemudian, hasil tersebut diperiksa terhadap kondisi filter Anda untuk membuat daftar akhir.
Misalnya, jika Anda menelusuri film serupa dan memiliki filter yang sangat luas seperti genre = drama, AlloyDB Omni 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 yang menggunakan vektor dan indeks sekunder lainnya untuk melakukan penelusuran vektor dan evaluasi filter secara bersamaan. AlloyDB Omni 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 Omni hanya memeriksa kesamaan sepatu yang sudah berwarna hitam. Hal ini lebih efisien daripada memeriksa kesamaan semua sepatu, lalu memfilter berdasarkan warna, atau memfilter semua sepatu berdasarkan warna, lalu memeriksa kesamaan.
Pemfilteran inline sangat baik saat filter mempersempit hasil secara moderat.
Memahami paket kueri
Paket kueri memberikan tampilan komprehensif dari proses eksekusi kueri dan menunjukkan strategi pemfilteran yang dipilih AlloyDB Omni untuk operasi pemindaian vektor di kolom Execution Strategy.
Paket kueri untuk pemfilteran inline
Untuk pemfilteran inline, AlloyDB Omni menggunakan node paket Custom Scan, yang juga dikenal sebagai pemindaian vektor, yang mengandalkan node paket Bitmap Index Scan 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 berdasarkan 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 Custom Scan 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 akan dilakukan penelusuran kesamaan. Pemindaian indeks bitmap digunakan untuk memfilter data berdasarkan kondisi color = 'black'.
Atribut Order By: (embedding <=> '[...]')::vector menunjukkan bahwa hasil diurutkan berdasarkan kesamaan 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.