通過為最近鄰(Nearest Neighbor)查詢建立帶有WHERE子句的索引,限制查詢範圍,從而提升高維資料查詢效率。
精確索引
支援基於以下精確索引類型,通過WHERE子句提供快速且精確的最近鄰搜尋。
(預設)B-tree
Hash
GiST
SP-GiST
GIN
BRIN
對於多列資料,您還可選擇多列索引。此類索引適用於匹配行數佔總行數比例較低的情境。
近似索引
除非匹配行數佔總行數比例較低,否則建議使用近似索引。近似索引掃描後執行過濾操作,例如,當條件匹配10%行且使用HNSW索引(預設hnsw.ef_search=40),平均只匹配4行,如需擷取多行結果可按需增大hnsw.ef_search值。
但使用近似索引執行帶有過濾條件的查詢可能會返回較少結果。對此0.8.0版本新增迭代索引掃描,可自動掃描更多索引內容,直到找到足夠的結果(或者達到hnsw.max_scan_tuples或ivfflat.max_probes的限制)。
外掛程式版本確認
確認外掛程式版本。
SELECT * FROM pg_extension WHERE extname = 'vector';查看返回結果中
extversion欄位,返回結果如下:oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition -------+---------+----------+--------------+----------------+------------+-----------+-------------- 17941 | vector | 17865 | 2200 | t | 0.8.0 | | (1 row)(可選)如不滿足0.8.0版本要求,可通過以下語句升級。
ALTER EXTENSION vector UPDATE TO '0.8.0';
迭代索引掃描
迭代索引掃描支援以下兩種排序方式:
strict_order:strict 模式,確保結果按照與查詢點的距離精確排序。relaxed_order:寬鬆模式,允許結果在距離排序上略有偏差,但提供更好的召回率。此外,還可以通過物化CTE擷取嚴格排序結果。
樣本
啟用迭代索引掃描。
設定為strict 模式。
-- HNSW索引 SET hnsw.iterative_scan = strict_order; -- IVFFlat索引 SET ivfflat.iterative_scan = strict_order;設定為寬鬆模式。
-- HNSW索引 SET hnsw.iterative_scan = relaxed_order; -- IVFFlat索引 SET ivfflat.iterative_scan = relaxed_order;
寬鬆模式時使用物化CTE擷取嚴格排序結果。
啟用迭代索引掃描,並設定為寬鬆模式。
使用物化CTE擷取嚴格排序結果。
WITH relaxed_results AS MATERIALIZED ( SELECT id, embedding <-> '[1,2,3]' AS distance FROM items WHERE id = 1 ORDER BY distance LIMIT 5 ) SELECT * FROM relaxed_results ORDER BY distance;對於按距離過濾的查詢,在使用物化CTE時建議將距離過濾條件放在外部,其他過濾條件應放置在CTE內部,以獲得最佳效能。
WITH nearest_results AS MATERIALIZED ( SELECT id, embedding <-> '[1,2,3]' AS distance FROM items ORDER BY distance LIMIT 5 ) SELECT * FROM nearest_results WHERE distance < 5 ORDER BY distance;
迭代索引掃描參數
由於掃描近似索引的較大部分成本較高,因此可以設定相關參數控制掃描結束時機。
索引類型 | 參數 | 描述 |
HNSW |
| 指定HNSW索引中允許的最大掃描元組數量,預設為20,000。 |
| 執行HNSW演算法時,允許的記憶體乘數,預設為1。與 如果增加 | |
IVFFlat |
| 在IVFFlat索引中進行查詢時,允許探測的最大探針數量。如果該值小於 |