AlloyDB 篩選向量搜尋功能簡介

本頁簡要說明 PostgreSQL 適用的 AlloyDB 中經過篩選的向量搜尋。

經過篩選的向量搜尋包含查詢向量和特定欄位的篩選條件。 AlloyDB 採用 PostgreSQL 豐富的查詢功能,可讓您透過單一 SQL 介面執行向量搜尋,並查詢結構化和非結構化資料。

篩選選項

AlloyDB 查詢最佳化工具在判斷向量搜尋最有效率的篩選策略時,扮演著至關重要的角色。

為估算不同執行方案的成本,查詢最佳化工具會分析查詢,並考量篩選器選擇性、資料分配和索引可用性等因素。

最佳化工具會根據成本預估,從下列選項中選擇最佳篩選策略:

預先篩選

預先篩選是一種查詢最佳化策略,AlloyDB 會使用篩選器找出符合條件的一小群項目,而不是搜尋整個資料集。接著,AlloyDB 會對這個較小的群組執行向量搜尋。

舉例來說,如果您要尋找類似的藍色襯衫,AlloyDB 會先找出所有藍色襯衫,然後在該群組中搜尋類似的項目。

這項策略會對縮減的資料集執行運算密集型向量相似度搜尋,因此能提升效能。

後續篩選

如果篩選器無法大幅縮小結果範圍,AlloyDB 就會採用後篩選策略。AlloyDB 不會先篩選,而是根據向量搜尋結果,找出大量相似項目。然後根據篩選條件檢查結果,產生最終清單。

舉例來說,如果您搜尋類似的電影,並使用非常廣泛的篩選器 (例如 genre = drama),AlloyDB 會先找出大量與搜尋內容相似的電影,然後依類型篩選,因為大多數電影可能都是劇情片。

如果您預期許多結果會符合篩選條件,這個策略就很有效率。

內嵌篩選

內嵌篩選是一種查詢最佳化策略,AlloyDB 會同時使用向量和其他次要索引執行向量搜尋和篩選評估。 AlloyDB 會搜尋向量索引來尋找相似的向量,並檢查每個向量是否符合中繼資料篩選條件,同時運用 B 樹狀結構、GIN 或 GiST 等索引,快速評估這些條件。

舉例來說,假設您搜尋類似的鞋子,並依 color = black 篩選,AlloyDB 就只會檢查黑色鞋子的相似度。這比先檢查所有鞋子的相似度,然後依顏色篩選,或是先依顏色篩選所有鞋子,然後檢查相似度更有效率。

如果篩選器可適度縮小結果範圍,內嵌篩選功能就能發揮最大效益。

瞭解查詢計畫

查詢計畫會提供查詢執行程序的完整檢視畫面,並在「執行策略」欄位中,顯示 AlloyDB 為向量掃描作業選擇的篩選策略。

內嵌篩選的查詢計畫

如要進行內嵌篩選,AlloyDB 會使用「自訂掃描」計畫節點 (也稱為向量掃描),該節點會依賴「點陣圖索引掃描」計畫節點,為篩選子句提供點陣圖。

向量掃描只會計算符合篩選條件的資料列距離。

下列查詢示範如何針對依 color = black 篩選的 shoes 搜尋結果進行內嵌篩選

EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;

下列查詢計畫範例說明如何使用內嵌篩選條件,進行最佳化向量搜尋:

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')

在範例查詢計畫中,Limit (actual rows=10) 表示查詢使用 SQL LIMIT 10; 子句來限制輸出內容。actual rows=10 表示這個節點在查詢執行期間傳回 10 個資料列。

-> Custom Scan (vector scan) on products 節點代表向量搜尋作業。這是自訂掃描,因為這是向量資料的特殊掃描,且會在 products 資料表上運作。內嵌篩選的查詢計畫範例會在「執行策略」欄位中顯示 Bitmap assisted vector Scan on products_embedding_index,表示向量掃描會使用點陣圖建立一小部分資料列,並對這些資料列執行相似度搜尋。點陣圖索引掃描用於根據 color = 'black' 條件篩選資料。

Order By: (embedding <=> '[...]')::vector 屬性表示結果會依據向量相似度排序,並使用 (embedding <=> '[...]')::vector 運算式計算,其中 embedding 是指向量資料欄,<=> 代表最鄰近運算子,[...] 是查詢向量,而 ::vector 則會執行型別轉換為向量資料型別。

-> Bitmap Index Scan on products (color_index) 節點代表 colors_index 上的點陣圖索引掃描。點陣圖索引掃描會使用點陣圖選取符合篩選條件的資料列,並使用 color_index 進行篩選。

Index Cond: (color = 'black') 屬性會指定查詢 WHERE 子句中 color = 'black' 索引掃描使用的篩選條件。

後續步驟