建立 IVFFLAT 索引

本頁說明如何使用儲存的嵌入項目產生索引,以及如何使用 IVFFlat索引查詢 AlloyDB for PostgreSQL 的嵌入項目。如要進一步瞭解如何儲存嵌入內容,請參閱「儲存向量嵌入內容」。

事前準備

開始建立索引前,請先完成下列必要條件。

建立 IVFFlat 索引

Stock pgvector 也提供名為 IVFFlatIVF 索引版本,與 hnsw 索引相比,建構時間更快,記憶體用量也較小。

如要建立 IVFFlat 索引,請完成下列步驟:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivfflat (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

更改下列內容:

  • INDEX_NAME:要建立的索引名稱,例如 my-ivf-index

  • TABLE:要新增索引的資料表。

  • EMBEDDING_COLUMN:儲存 vector 資料的資料欄。

  • DISTANCE_FUNCTION:要用於這個索引的距離函式。選擇下列其中一個選項:

    • L2 距離: vector_l2_ops

    • 內積: vector_ip_ops

    • 餘弦距離: vector_cosine_ops

  • LIST_COUNT:要搭配這個索引使用的清單數量。如要進一步瞭解如何決定這個值,請參閱「調整 IVFFlat 索引」。

    如要在使用 real[] 資料類型 (而非 vector) 的嵌入資料欄上建立這個索引,請將資料欄轉換為 vector 資料類型:

CREATE INDEX INDEX_NAME ON TABLE
  USING ivfflat (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT);

請將 DIMENSIONS 改成嵌入資料欄的維度寬度。如要進一步瞭解如何尋找維度,請參閱向量函式中的 vector_dims 函式。

如要查看索引建立進度,請使用 pg_stat_progress_create_index 檢視畫面:

SELECT * FROM pg_stat_progress_create_index;

phase 欄會顯示索引建立作業的目前狀態。

如要調整索引,以達到目標召回率和每秒查詢次數平衡,請參閱「調整 IVFFlat 索引」。

執行查詢

將嵌入內容儲存並編入資料庫索引後,即可開始使用pgvector查詢功能進行查詢。

如要找出嵌入向量最鄰近的語意鄰項,可以執行下列查詢範例,並設定與建立索引時相同的距離函式。

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

更改下列內容:

  • TABLE:包含要與文字比較的嵌入內容的資料表。

  • INDEX_NAME:要使用的索引名稱,例如 my-scann-index

  • EMBEDDING_COLUMN:包含儲存的嵌入內容的資料欄。

  • DISTANCE_FUNCTION_QUERY:要用於這項查詢的距離函式。根據建立索引時使用的距離函式,選擇下列其中一項:

    • L2 距離: <->

    • 內積: <#>

    • 餘弦距離: <=>

  • EMBEDDING:您要找出最鄰近儲存語意鄰項的嵌入向量。

  • ROW_COUNT:要傳回的列數。

    如只要取得最佳單一比對結果,請指定 1

如要查看其他查詢範例,請參閱「查詢」。

您也可以使用 embedding() 函式將文字翻譯成向量。將向量套用至其中一個pgvector最鄰近運算子<-> (適用於 L2 距離),找出具有語意最相似嵌入項目的資料庫列。

由於 embedding() 會傳回 real 陣列,您必須明確將 embedding() 呼叫轉換為 vector,才能搭配 pgvector 運算子使用這些值。

後續步驟