Ringkasan penelusuran vektor yang difilter di AlloyDB

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.

Langkah berikutnya