最近傍クエリの効率を向上させ、検索範囲を絞り込むために、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: 結果を距離で正確にソートします。relaxed_order: 結果が距離ベースの順序からわずかに外れることを許可しますが、より良い再現率を提供します。「マテリアライズド CTE」を使用して、厳密な順序付けを行うことができます。
[例]
反復インデックススキャンを有効にします。
厳密な順序付けを指定します。
-- 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 の外に配置し、他のフィルターを 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 でのクエリ中にスキャンできるタプルの最大数を指定します。デフォルト値:20000。 |
| HNSW アルゴリズムの実行中に許可される最大メモリ乗数を指定します。デフォルト値:1。
| |
IVFFlat |
| IVFFlat インデックスでのクエリ中に許可されるプローブの最大数を指定します。この値が |