全部產品
Search
文件中心

PolarDB:近似索引

更新時間:Apr 23, 2025

預設情況下,pgvector執行精確的最近鄰搜尋,該搜尋可提供完美的召回率。您可以通過添加索引使用近似的最近鄰搜尋,可提升檢索速度但犧牲一部分召回率。與典型索引不同,增加近似索引後,查詢結果可能存在差異。支援的近似索引類型包括:HNSWIVFFlat

HNSW

HNSW索引用於構建多層圖結構。與IVFFlat相比,其查詢效能更好(在速度-召回率權衡方面),但構建時間更長,且佔用更多記憶體。此外,由於沒有像IVFFlat那樣的訓練步驟,支援在表中沒有任何資料的情況下建立索引。

建立HNSW索引

您可為您需要使用的距離建立相應索引。

歐幾裡得距離(L2)

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
說明

對於不同向量類型需要使用不同距離計算操作,例如,halfvec使用halfvec_l2_opssparsevec使用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維。

索引建立選項

參數

描述

m

每層的最大串連數,預設為16。

ef_construction

構建圖時動態候選列表的大小預設為64。值越高,召回率越佳,但將延長索引構建時間和插入速度。

樣本

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);

查詢選項

參數

描述

hnsw.ef_search

指定搜尋時動態候選列表的大小,預設為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_opssparsevec使用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維。

查詢選項

參數

描述

ivfflat.probes

指定探測次數,預設為1。值越高,召回率越佳,但查詢速度越慢。可以將其設定為列表的數量以進行精確的最近鄰搜尋(此時規劃器將不會使用索引)。

樣本

事務級設定。在目標事務中使用SET LOCAL設定單個查詢語句值。

BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;

最佳化索引構建時間

索引建立速度與多個參數有關,如下所示:

參數

描述

maintenance_work_mem

定義叢集在執行維護性操作(包括索引建立)時可用的記憶體大小。當圖的所有資料可以容納在maintenance_work_mem中時,將顯著加快索引構建速度。不建議設定過高導致叢集記憶體耗盡,請根據叢集規格來調整該參數的值。

當圖不再適合放入記憶體,系統將顯示以下通知:

NOTICE:  hnsw 圖在 100000 個元組後不再適合放入 maintenance_work_mem
DETAIL:  構建將需要顯著更多的時間。
HINT:  增加 maintenance_work_mem 可以加速構建。
說明

僅針對HNSW索引構建最佳化。

max_parallel_maintenance_workers

定義並行背景工作執行緒數量,預設為2。可通過增加線程數加速索引構建。例如設定並行背景工作執行緒數量為8:

SET max_parallel_maintenance_workers = 7; -- 加上leader線程
說明

對於大量背景工作執行緒,您可以增加max_parallel_workers(預設為 8)。

此外,與其他索引類型類似,在載入初始資料後再建立索引的效率更高。HNSW索引建立選項對構建時間也有顯著影響。

查詢索引構建進度

可查看pg_stat_progress_create_index視圖確認索引建立進度。

  • HNSW的階段包括:

    1. initializing(初始化)

    2. loading tuples(載入元組)

  • IVFFlat的階段包括:

    1. initializing(初始化)

    2. performing k-means(執行 k-means)

    3. assigning tuples(分配元組)

    4. 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階段更新%欄位。