預設情況下,pgvector執行精確的最近鄰搜尋,該搜尋可提供完美的召回率。您可以通過添加索引使用近似的最近鄰搜尋,可提升檢索速度但犧牲一部分召回率。與典型索引不同,增加近似索引後,查詢結果可能存在差異。支援的近似索引類型包括:HNSW和IVFFlat。
HNSW
HNSW索引用於構建多層圖結構。與IVFFlat相比,其查詢效能更好(在速度-召回率權衡方面),但構建時間更長,且佔用更多記憶體。此外,由於沒有像IVFFlat那樣的訓練步驟,支援在表中沒有任何資料的情況下建立索引。
建立HNSW索引
您可為您需要使用的距離建立相應索引。
歐幾裡得距離(L2)
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);對於不同向量類型需要使用不同距離計算操作,例如,halfvec使用halfvec_l2_ops,sparsevec使用sparsevec_l2_ops,其他距離函數類似。
內積距離
CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);餘弦距離
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);曼哈頓距離(L1)
CREATE INDEX ON items USING hnsw (embedding vector_l1_ops);漢明距離
CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops);Jaccard距離
CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);支援以下向量類型:
Vector:向量,最多支援2,000維。Halfvec:半精度向量,最多支援4,000維。Sparsevec:稀疏向量,最多支援1,000個非零元素。Bit:位向量,最多支援64,000維。
索引建立選項
參數 | 描述 |
| 每層的最大串連數,預設為16。 |
| 構建圖時動態候選列表的大小預設為64。值越高,召回率越佳,但將延長索引構建時間和插入速度。 |
樣本
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);查詢選項
參數 | 描述 |
| 指定搜尋時動態候選列表的大小,預設為40。值越高,召回率越佳,但查詢速度越慢。 |
樣本
會話級設定。
SET hnsw.ef_search = 100;事務級設定。在目標事務中使用
SET LOCAL設定單個查詢語句值。BEGIN; SET LOCAL hnsw.ef_search = 100; SELECT ... COMMIT;
IVFFlat
IVFFlat索引結合了倒排索引和向量搜尋的優點,通過將向量劃分為多個列表,然後搜尋那些與查詢向量最接近的子集列表。對比HNSW索引,其構建速度更快,佔用的記憶體更少,但查詢效能上較低(在速度-召回率權衡方面)。
要獲得良好的召回率,需要注意以下三點:
在表中已有資料的情況下建立索引。
選擇合適的列表數量。對於最多1M行的資料,建議從
行數 / 1000開始,對於超過1M行的資料,建議從sqrt(行數)開始。查詢時指定合理探針數,更高的探針數有助於提高召回率,但會降低查詢速度,建議使用
sqrt(列表數)。
建立IVFFlat索引
您可為您需要使用的距離建立相應索引。
歐幾裡得距離(L2)
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);對於不同向量類型需要使用不同距離計算操作,例如,halfvec使用halfvec_l2_ops,sparsevec使用sparsevec_l2_ops,其他距離函數類似。
內積距離
CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);餘弦距離
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);漢明距離
CREATE INDEX ON items USING ivfflat (embedding bit_hamming_ops) WITH (lists = 100);支援以下向量類型:
Vector:向量,最多支援2,000維。Halfvec:半精度向量,最多支援4,000維。Bit:位向量,最多支援64,000維。
查詢選項
參數 | 描述 |
| 指定探測次數,預設為1。值越高,召回率越佳,但查詢速度越慢。可以將其設定為列表的數量以進行精確的最近鄰搜尋(此時規劃器將不會使用索引)。 |
樣本
事務級設定。在目標事務中使用SET LOCAL設定單個查詢語句值。
BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;最佳化索引構建時間
索引建立速度與多個參數有關,如下所示:
參數 | 描述 |
| 定義叢集在執行維護性操作(包括索引建立)時可用的記憶體大小。當圖的所有資料可以容納在 當圖不再適合放入記憶體,系統將顯示以下通知: 說明 僅針對HNSW索引構建最佳化。 |
| 定義並行背景工作執行緒數量,預設為2。可通過增加線程數加速索引構建。例如設定並行背景工作執行緒數量為8: 說明 對於大量背景工作執行緒,您可以增加 |
此外,與其他索引類型類似,在載入初始資料後再建立索引的效率更高。HNSW索引建立選項對構建時間也有顯著影響。
查詢索引構建進度
可查看pg_stat_progress_create_index視圖確認索引建立進度。
HNSW的階段包括:
initializing(初始化)loading tuples(載入元組)
IVFFlat的階段包括:
initializing(初始化)performing k-means(執行 k-means)assigning tuples(分配元組)loading tuples(載入元組)
--- HNSW
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
--- IVFFlat
SELECT phase, round(100.0 * tuples_done / nullif(tuples_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;僅在loading tuples階段更新%欄位。