すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:ベクトルインデックスの作成

最終更新日:Sep 24, 2024

データベースクエリの最適化、機械学習、データマイニング、画像とビデオの検索、空間データクエリなど、大量のデータが必要な検索シナリオや高速データアクセスが必要な検索シナリオでは、ベクトルインデックスを作成してベクトル検索を高速化できます。 これにより、データ分析を高速化し、検索ジョブを最適化し、システムのクエリパフォーマンスと応答効率を向上させることができます。

背景情報

AnalyticDB for PostgreSQLベクトルデータベースは、FastANNベクトル検索エンジンを使用して、主流のHierarchical Navigable Small World (HNSW) アルゴリズムを実装します。 FastANNベクトル検索エンジンは、PostgreSQLのセグメント化されたページングストレージを使用し、ベクトル列ポインタのみをインデックスに格納して、ベクトルインデックスによって占有されるストレージを大幅に削減します。 ベクトル検索エンジンは、積量子化 (PQ) 機能を使用して、高次元ベクトルの次元数を削減します。 このように、低次元ベクトルをインデックスに格納して、ベクトルを挿入またはクエリするときのインデックスの検索を減らし、ベクトル検索のパフォーマンスを向上させます。

構文

CREATE INDEX [INDEX_NAME]
ON [SCHEMA_NAME].[TABLE_NAME]   
USING ANN(COLUMN_NAME) 
WITH (DIM=<DIMENSION>,
      DISTANCEMEASURE=<MEASURE>,
      HNSW_M=<M>,
      HNSW_EF_CONSTRUCTION=<EF_CONSTURCTION>,
      PQ_ENABLE=<PQ_ENABLE>,
      PQ_SEGMENTS=<PQ_SEGMENTS>,
      PQ_CENTERS=<PQ_CENTERS>,
      EXTERNAL_STORAGE=<EXTERNAL_STORAGE>);

パラメーター:

  • INDEX_NAME: インデックスの名前。

  • SCHEMA_NAME: スキーマまたは名前空間の名前。

  • TABLE_NAME: テーブルの名前。

  • COLUMN_NAME: ベクトルインデックス列の名前。

  • 次の表に、その他のベクトルインデックスパラメーターを示します。

    ベクトルインデックスパラメーター

    必須

    説明

    デフォルト

    値の範囲

    DIM

    継続する

    ベクトル次元の数。 このパラメータは、ベクトルが挿入されるときにベクトルをチェックするために使用されます。 ベクトル次元の数が一致しない場合、システムはエラーメッセージを表示します。

    0

    [1, 8192]

    距離測定

    継続しない

    距離または類似性の測定。 有効な値:

    • L2: 平方ユークリッド距離関数を使用してインデックスを作成します。 この測定は、画像類似性検索シナリオに適している。

      式: image.png

    • IP: 負の内積距離関数を使用してインデックスを作成します。 この測定値を用いて、ベクトル正規化後のコサイン類似性を置き換える。

      式: image.png

    • COSINE: コサイン距離関数を使用してインデックスを作成します。 この測定は、テキスト類似性検索シナリオに適している。

      式: image.png

    説明
    • DISTANCEMEASUREパラメーターをIPまたはCOSINEに設定した場合、AnalyticDB for PostgreSQLインスタンスのマイナーバージョンが6.3.10.18以降であることを確認します。 マイナーバージョンを表示および更新する方法については、「インスタンスのマイナーバージョンの更新」をご参照ください。

    • 最高のパフォーマンスを実現するには、正規化されたベクトルデータをデータベースに保存し、内積距離の測定値を使用してインデックスを作成することをお勧めします。

      内積距離尺度を使用してインデックスを作成する場合、ユークリッド距離とコサイン類似度をクエリすることもできます。 詳細については、「ベクトル検索の実行」をご参照ください。

    • ベクトル検索用のユーザー定義関数 (UDF) の詳細については、このトピックの「参照」を参照してください。

    L2

    (L2、IP、コイン)

    HNSW_M

    継続しない

    HNSWアルゴリズムのネイバーの最大数。

    32

    [10, 1000]

    HNSW_EF_CONSTRUCTION

    継続しない

    HNSWアルゴリズムを使用してインデックスを作成する場合の候補セットのサイズ。

    600

    [40, 4000]

    PQ_ENABLE

    継続しない

    PQフィーチャーを有効にするかどうかを指定します。 PQ機能は、トレーニングに既存のベクトルサンプルデータを使用します。 データの行数が500,000未満の場合は、このパラメーターを指定しないことを推奨します。

    0

    [0, 1]

    PQ_SEGMENTS

    継続しない

    PQ機能を有効にした後にK平均クラスタリングアルゴリズムで使用されるセグメントの数。 このパラメーターは、PQ_ENABLEパラメーターを1に設定した場合にのみ有効です。

    • DIMパラメーターを8で割った値が整数の場合、このパラメーターを指定する必要はありません。 それ以外の場合は、このパラメーターを指定する必要があります。

    • PQ_SEGMENTSパラメーターの値は0より大きくなければなりません。 DIMパラメーターをPQ_SEGMENTSパラメーターで割った値は整数である必要があります。

    0

    [1, 256]

    PQ_CENTERS

    継続しない

    PQ機能を有効にした後にK-meansクラスタリングアルゴリズムで使用される重心の数。 このパラメーターは、PQ_ENABLEパラメーターを1に設定した場合にのみ有効です。

    2048

    [256, 8192]

    EXTERNAL_STORAGE

    継続しない

    メモリマッピング技術を使用してHNSWインデックスを作成するかどうかを指定します。 有効な値:

    • 0: セグメント化されたページングストレージを使用してインデックスを作成します。 このメソッドは、キャッシュにPostgreSQLの共有バッファーを使用し、DELETEおよびUPDATE操作をサポートします。

    • 1: メモリマッピング技術を使用してインデックスを作成します。 このメソッドは、インデックスのマーク付き削除をサポートし、V6.6.2.3以降のAnalyticDB for PostgreSQLインスタンスに対して少数のDELETEおよびUPDATE操作を実行できます。

    0

    [0, 1]

この例では、テキスト知識ベースが使用されます。 知識ベース内のアーティクルは、チャンクに分割され、埋め込みベクトルに変換され、データベースに格納される。 次の表に、chunkという名前のテーブルに含まれるフィールドを示します。

項目

データ型

説明

id

シリアル

シリアル番号。

チャンク

VARCHAR(1024)

テキストチャンク。The text chunk.

インタイム

TIMESTAMP

記事がデータベースに保存された時刻。

url

VARCHAR(1024)

テキストチャンクが属するアーティクルのURL。

特徴

REAL[]

テキストチャンクの埋め込みベクトル。

  1. ベクトルを格納するテーブルを作成します。

    CREATE TABLE chunks (
        id SERIAL PRIMARY KEY,
        chunk VARCHAR(1024),
        intime TIMESTAMP,
        url VARCHAR(1024),
        feature REAL[]
    ) DISTRIBUTED BY (id);
  2. ベクトル列のストレージモードをPLAINに設定して、データスキャンのコストを削減し、パフォーマンスを向上させます。

    ALTER TABLE chunks ALTER COLUMN feature SET STORAGE PLAIN;
  3. ベクトル列のベクトルインデックスを作成します。

    -- Create a vector index based on the Euclidean distance. 
    CREATE INDEX idx_chunks_feature_l2 ON chunks USING ann(feature) WITH (dim=1536, distancemeasure=l2, hnsw_m=64, pq_enable=1);
    -- Create a vector index based on the inner product distance. 
    CREATE INDEX idx_chunks_feature_ip ON chunks USING ann(feature) WITH (dim=1536, distancemeasure=ip, hnsw_m=64, pq_enable=1);
    -- Create a vector index based on the cosine similarity. 
    CREATE INDEX idx_chunks_feature_cosine ON chunks USING ann(feature) WITH (dim=1536, distancemeasure=cosine, hnsw_m=64, pq_enable=1);
    説明
    • 各ベクトルテーブルに複数のベクトル列を作成し、各ベクトル列に複数のベクトルインデックスを作成できます。 無効なインデックスを回避するには、ビジネス要件に基づいてベクトルインデックスを作成する必要があります。

    • ベクトル検索方法は、対応する距離測定値を使用して作成されたベクトルインデックスと一致する必要があります。 たとえば、<-> 演算子はユークリッド距離を使用して作成されたベクトルインデックスで機能し、<#> 演算子は内積距離を使用して作成されたベクトルインデックスで機能し、<=> 演算子はコサイン類似度を使用して作成されたベクトルインデックスで機能します。 演算子が対応するベクトルインデックスで機能しない場合、ベクトル検索方法は完全検索 (総当たり検索) にダウングレードされます。

    • FastANNベクトル検索拡張機能によって提供されるANNアクセス方法を使用します。 AnalyticDB for PostgreSQLインスタンスのベクトル検索エンジン最適化機能を有効にすると、FastANNベクトル検索拡張機能がAnalyticDB for PostgreSQLインスタンスに自動的に作成されます。

    • データ型に演算子クラスを指定するか、既定の演算子クラスを定義する必要がありますというエラーメッセージが表示された場合、AnalyticDB for PostgreSQLインスタンスでベクトル検索エンジン最適化機能が有効になっていません。 この場合は、機能を有効にしてからもう一度お試しください。 詳細については、「ベクトル検索エンジンの最適化の有効化または無効化」をご参照ください。

  4. 構造化データ列のインデックスを作成して、ハイブリッド検索を高速化します。

    CREATE INDEX ON chunks(intime);

インデックス作成モード

次のいずれかのモードでベクターインデックスを作成できます。

  • ストリーミングモード

    空のテーブルを作成し、そのテーブルのベクトルインデックスを作成します。 このように、ストリーミングインデックスは、ベクターデータをインポートするときにリアルタイムで作成されます。 このモードは、リアルタイムのベクトル検索シナリオに適しています。 ただし、このモードではベクトルデータをすばやくインポートできません。

  • 非同期モード

    空のテーブルを作成し、そのテーブルにベクトルデータをインポートしてから、インポートしたベクトルデータのベクトルインデックスを作成します。 このモードは、大量のベクトルデータをインポートするシナリオに適しています。

説明

AnalyticDB for PostgreSQLでは、非同期モードで同時にベクターインデックスを作成できます。 Grand Unified Configuration (GUC) パラメーターfastann.build_parallel_processesを使用して、同時インデックス作成プロセスの数を指定できます。

たとえば、データ管理 (DMS) を使用して、非同期モードでインデックスを作成できます。 サンプルコード:

-- For example, an AnalyticDB for PostgreSQL instance whose compute node specifications are 8 cores and 32 GB memory is used. 
-- To prevent timeout errors, set the statement_timeout and idle_in_transaction_session_timeout parameters to 0. 
-- Set the fastann.build_parallel_processes parameter to 8 to ensure that the CPU resources of compute nodes are fully utilized. The value of the fastann.build_parallel_processes parameter must be the same as the number of CPU cores in the compute node specifications. 
-- In DMS, you must specify values for parameters in the same line as the index creation statement. 
SET statement_timeout = 0;SET idle_in_transaction_session_timeout = 0;SET fastann.build_parallel_processes = 8;CREATE INDEX ON chunks USING ann(feature) 
WITH (dim=1536, distancemeasure=cosine, hnsw_m=64, pq_enable=1);

psqlツールを使用して、非同期モードでインデックスを作成できます。 サンプルコード:

-- For example, an AnalyticDB for PostgreSQL instance whose compute node specifications are 8 cores and 32 GB memory is used. 

-- Step 1: Store the following content in the create_index.sql file: 
SET statement_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET fastann.build_parallel_processes = 8;
CREATE INDEX ON chunks USING ann(feature) WITH (dim=1536, distancemeasure=cosine, hnsw_m=64, pq_enable=1);

-- Step 2: Run the following command to create an index in parallel: 
psql -h gp-xxxx-master.gpdb.rds.aliyuncs.com -p 5432 -d dbname -U username -f create_index.sql
重要

AnalyticDB for PostgreSQLインスタンスで他のサービスが実行されている場合、同時インデックス作成プロセスの数をコンピューティングノード仕様のCPUコアの数に設定することはできません。

関連ドキュメント

サポートされているベクトル関数

目的

ベクトル関数

戻り値のデータ型

説明

サポートされるデータ型

計算

l2_distance

DOUBLE PRECISION

2つのベクトル間のルートユークリッド距離を計算します。 この関数は、2つのベクトル間の距離を測定するために使用され、画像類似性検索シナリオに適しています。

重要

V6.3.10.17以前のAnalyticDB For PostgreSQLインスタンスの場合、l2_distance関数は2乗ユークリッド距離を計算します。 V6.3.10.18以降のAnalyticDB For PostgreSQLインスタンスの場合、l2_distance関数はルートユークリッド距離を計算します。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

inner_product_distance

DOUBLE PRECISION

2つのベクトル間の内積距離を計算します。これは、ベクトル正規化後のコサイン類似度に相当します。 この関数は、ベクトル正規化後のコサイン類似性を置き換えるために使用されます。

式: image.png

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

cosine_similarity

DOUBLE PRECISION

2つのベクトル間のコサイン類似度を計算します。 この関数は、ベクトルの実際の長さに関係なく、方向に基づいて2つのベクトル間の類似性を測定するために使用されます。 コサイン類似度の有効値: -1〜1。

式: image.png

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

dp_distance

DOUBLE PRECISION

内積距離と同じドット積距離を計算します。

式: image.png

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

hm_distance

INTEGER

ハミング距離を計算します。ハミング距離は、2つの2進文字列の対応するビットが異なるビット位置の数です。

INT[]

vector_add

SMALLINT[] 、FLOAT2[] 、またはFLOAT4[]

2つのベクトル配列の合計を計算します。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

vector_sub

SMALLINT[] 、FLOAT2[] 、またはFLOAT4[]

2つのベクトル配列の差を計算します。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

vector_mul

SMALLINT[] 、FLOAT2[] 、またはFLOAT4[]

2つのベクトル配列の積を計算します。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

vector_div

SMALLINT[] 、FLOAT2[] 、またはFLOAT4[]

2つのベクトル配列の商を計算します。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

vector_sum

INTまたは二倍の精度

ベクトル配列のすべての要素の合計を計算します。

SMALLINT[] 、INT[] 、FLOAT2[] 、FLOAT4[] 、REAL[] 、およびFLOAT8[]

vector_min

INTまたは二倍の精度

ベクトル配列のすべての要素の最小値を計算します。

SMALLINT[] 、INT[] 、FLOAT2[] 、FLOAT4[] 、REAL[] 、およびFLOAT8[]

vector_max

INTまたは二倍の精度

ベクトル配列のすべての要素の最大値を計算します。

SMALLINT[] 、INT[] 、FLOAT2[] 、FLOAT4[] 、REAL[] 、およびFLOAT8[]

vector_avg

INTまたは二倍の精度

ベクトル配列のすべての要素の平均値を計算します。

SMALLINT[] 、INT[] 、FLOAT2[] 、FLOAT4[] 、REAL[] 、およびFLOAT8[]

vector_norm

DOUBLE PRECISION

ベクトル配列のノルムを計算します。

SMALLINT[] 、INT[] 、FLOAT2[] 、FLOAT4[] 、REAL[] 、およびFLOAT8[]

vector_angle

DOUBLE PRECISION

2つのベクトル配列間の角度を計算します。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

ソート

l2_squared_distance

DOUBLE PRECISION

平方ユークリッド距離に基づいてベクトルをソートします。 この関数は、根付きユークリッド距離に基づくソート方法よりも少ない計算で済みます。

式: image.png

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

negative_inner_product_distance

DOUBLE PRECISION

負の内積距離に基づいてベクトルをソートします。 この関数は、内積距離に基づいてベクトルを降順でソートするために使用されます。

式: image.png

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

cosine_distance

DOUBLE PRECISION

余弦距離に基づいてベクトルをソートします。 この関数は、降順のコサイン類似度に基づいてベクトルをソートするために使用されます。 コサイン距離の有効値: 0〜2。

式: image.png

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

重要

V6.6.1.0以降のAnalyticDB for PostgreSQLインスタンスのみが、vector_add、vector_sub、vector_mul、vector_div、vector_sum、vector_min、vector_max、vector_avg、vector_norm、vector_angleをサポートしています。 AnalyticDB For PostgreSQLインスタンスのマイナーバージョンを表示する方法については、「インスタンスのマイナーバージョンの表示」をご参照ください。

ベクトル関数の例:

-- Euclidean distance
SELECT l2_distance(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Inner product distance
SELECT inner_product_distance(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Cosine similarity
SELECT cosine_similarity(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Dot product distance
SELECT dp_distance(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Hamming distance
SELECT hm_distance(array[1,0,1,0]::int[], array[0,1,0,1]::int[]);
-- Sum of two vector arrays
SELECT vector_add(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Difference between two vector arrays
SELECT vector_sub(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Product of two vector arrays
SELECT vector_mul(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Quotient of two vector arrays
SELECT vector_div(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);
-- Sum of all elements in a vector array
SELECT vector_sum(array[1,1,1,1]::real[]);
-- Minimum value among all elements in a vector array
SELECT vector_min(array[1,1,1,1]::real[]);
-- Maximum value among all elements in a vector array
SELECT vector_max(array[1,1,1,1]::real[]);
-- Average value of all elements in a vector array
SELECT vector_avg(array[1,1,1,1]::real[]);
-- Norm of a vector array
SELECT vector_norm(array[1,1,1,1]::real[]);
-- Angle between two vector arrays
SELECT vector_angle(array[1,1,1,1]::real[], array[2,2,2,2]::real[]);

サポートされるベクトル演算子

ベクトル演算子

計算

並べ替え

サポートされるデータ型

<->

2つのベクトル間の二乗ユークリッド距離を計算します。 結果は、l2_squared_distance関数の結果と同等です。

二乗されたユークリッド距離に基づいてベクトルを昇順でソートします。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

<#>

2つのベクトル間の負の内積距離を計算します。 結果は、negative_inner_product_distance関数の結果と同等です。

ドット積の距離に基づいてベクトルを降順に並べ替えます。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

<=>

2つのベクトル間のコサイン距離を計算します。 結果は、cosine_distance関数の結果に相当します。

コサイン類似度に基づいてベクトルを降順にソートします。

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

+

2つのベクトルの合計を計算します。

なし

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

-

2つのベクトルの差を計算します。

なし

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

*

2つのベクトルの積を計算します。

なし

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

/

2つのベクトルの商を計算します。

なし

SMALLINT[] 、FLOAT2[] 、FLOAT4[] 、およびREAL[]

重要

V6.6.1.0以降のAnalyticDB for PostgreSQLインスタンスのみが、+-*/のベクトル演算子をサポートしています。 AnalyticDB For PostgreSQLインスタンスのマイナーバージョンを表示する方法については、「インスタンスのマイナーバージョンの表示」をご参照ください。

ベクトル演算子の例:

-- Euclidean distance
SELECT array[1,1,1,1]::real[] <-> array[2,2,2,2]::real[] AS score;
-- Inner product distance
SELECT array[1,1,1,1]::real[] <#> array[2,2,2,2]::real[] AS score;
-- Cosine distance
SELECT array[1,1,1,1]::real[] <=> array[2,2,2,2]::real[] AS score;

-- Sum of two vectors
SELECT array[1,1,1,1]::real[] + array[2,2,2,2]::real[] AS value;
-- Difference between two vectors
SELECT array[1,1,1,1]::real[] - array[2,2,2,2]::real[] AS value;
-- Product of two vectors
SELECT array[1,1,1,1]::real[] * array[2,2,2,2]::real[] AS value;
-- Quotient of two vectors
SELECT array[1,1,1,1]::real[] / array[2,2,2,2]::real[] AS value;