データベースクエリの最適化、機械学習、データマイニング、画像とビデオの検索、空間データクエリなど、大量のデータが必要な検索シナリオや高速データアクセスが必要な検索シナリオでは、ベクトルインデックスを作成してベクトル検索を高速化できます。 これにより、データ分析を高速化し、検索ジョブを最適化し、システムのクエリパフォーマンスと応答効率を向上させることができます。
背景情報
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: 平方ユークリッド距離関数を使用してインデックスを作成します。 この測定は、画像類似性検索シナリオに適している。
式:
IP: 負の内積距離関数を使用してインデックスを作成します。 この測定値を用いて、ベクトル正規化後のコサイン類似性を置き換える。
式:
COSINE: コサイン距離関数を使用してインデックスを作成します。 この測定は、テキスト類似性検索シナリオに適している。
式:
説明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[] | テキストチャンクの埋め込みベクトル。 |
ベクトルを格納するテーブルを作成します。
CREATE TABLE chunks ( id SERIAL PRIMARY KEY, chunk VARCHAR(1024), intime TIMESTAMP, url VARCHAR(1024), feature REAL[] ) DISTRIBUTED BY (id);
ベクトル列のストレージモードをPLAINに設定して、データスキャンのコストを削減し、パフォーマンスを向上させます。
ALTER TABLE chunks ALTER COLUMN feature SET STORAGE PLAIN;
ベクトル列のベクトルインデックスを作成します。
-- 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インスタンスでベクトル検索エンジン最適化機能が有効になっていません。 この場合は、機能を有効にしてからもう一度お試しください。 詳細については、「ベクトル検索エンジンの最適化の有効化または無効化」をご参照ください。
構造化データ列のインデックスを作成して、ハイブリッド検索を高速化します。
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コアの数に設定することはできません。