ベクトルインデックスのトラブルシューティング
次の表に、ベクトルインデックスを使用する際の一般的な問題とその解決方法を示します。
| 症状 | 原因 | 解決策 |
|---|---|---|
ValidationException: SearchConditionExpression must be
provided when SearchSchema has a HASH key |
インデックスは SearchSchema でベクトルインデックスのパーティションキー (HASH) を定義していますが、検索でその値が指定されませんでした。 |
SearchConditionExpression にベクトルインデックスのパーティションキーの等価条件 (例: Category = :cat) を追加し、それに対応する ExpressionAttributeValues エントリも指定します。 |
ValidationException: One element in SearchSchema is not
defined in attribute definitions |
SearchSchema 属性 (ベクトルインデックスのパーティションキーまたはインラインフィルター) が、テーブルの AttributeDefinitions で宣言されていません。 |
グローバルセカンダリインデックスに対してキー属性が宣言されるのと同じ方法で、すべての SearchSchema 属性をそのタイプと共に AttributeDefinitions に追加します。 |
ValidationException: Invalid comparator used in
SearchConditionExpression |
= 以外の演算子が使用されました。現在、ベクトルインデックスのパーティションキーとインラインフィルター属性では、等価演算子のみがサポートされています。 |
= のみを使用するように条件を書き換えます。比較、範囲、および集合メンバーシップ演算子はまだ利用できません。 |
ValidationException: Provided TopK value is out of valid
range |
TopK は 1~100 の範囲外でした。 |
TopK を 1〜100 の値に設定します。 |
インデックスのバックフィル中に SearchVectors がエラーを返します |
ベクトルインデックスは、まだ検索の準備ができていません。IndexStatus が CREATING であるか、IndexStatus が ACTIVE で Backfilling が true に設定されているかのいずれかです。バックフィルが完了するまで、ベクトルインデックスを検索することはできません。 |
DescribeTable を使用して、Backfilling が false になるまで待ってから、検索を再試行します。 |
| ベクトルを含む項目を書き込む際、書き込みが拒否されます | ベクトルのインデックスのディメンション数が正しくありません。 | ベクトルの長さがインデックスの Dimensions と一致することを確認します。「ベクトルデータを含む項目の書き込み」を参照してください。 |
| 「パラメータのタイプが無効です」で書き込みが拒否されました | ベクトル属性のデータ型が正しくありません。DynamoDB は、32 ビット浮動小数点数のリストを想定しています。一般的な原因には、文字列 (S)、数値スカラー (N)、数値セット (NS)、または数値以外の要素を含むリストの送信などがあります。エラーメッセージは、単一のメンバーの型が間違っている場合に、問題のある要素のインデックスを特定します。 |
ベクトル属性を数値 (N) のリスト (L) として送信します。リスト内のすべての要素が有効な数値であり、リストの長さがインデックスの Dimensions と一致することを確認します。 |
ベクトルインデックスのパーティションキー属性を削除または省略した後、項目が SearchVectors によって返されなくなりました |
項目からベクトルインデックスのパーティションキー属性を削除したり (UpdateItem で REMOVE を使用)、PutItem で省略したりしてもエラーは発生しません。ただし、ベーステーブル項目とそのベクトル埋め込みがまだ存在していても、項目はサイレントにインデックス解除され、検索結果に表示されなくなります。 |
検索対象とするすべての項目が、ベクトルインデックスのパーティションキー属性を保持していることを確認します。項目が予期せず検索結果に表示されない場合は、そのパーティションキー属性がベーステーブル項目に依然として存在することを確認します。 |
| ベクトルインデックスのパーティションキーに対して、「空の文字列値を含めることはできません」または型の不一致で書き込みが拒否されました | ベクトルインデックスのパーティションキー属性が空の文字列に設定されたか、間違ったデータ型で書き込まれました。DynamoDB は、インデックスキー属性を空にできず、宣言された型と一致する必要があるため、これらの書き込みを拒否します。 | ベクトルインデックスのパーティションキー属性に、空でない有効な値と正しいデータ型を使用します。インデックス定義を確認して、期待される型を確認します。 |
| 検索結果に属性が不足しています | ベクトルインデックスはこの属性を射影しません。 | インデックスに射影された属性のみを取得できます。追加の属性を返すには、より広範な射影でインデックスを再作成するか、ProjectionType を ALL に設定します。 |
既存のベクトルインデックスにパーティションキーを追加する
ベクトルインデックスの SearchSchema は作成時に固定されます。インデックスの作成後にパーティションキー (HASH) を追加、削除、または変更することはできません。インラインフィルターの属性を変更することもできません。スキーマを変更するには、新しいインデックスを作成して移行します。
パーティションキーを追加したり、他の SearchSchema 属性を変更したりするには、次の手順を実行します。
-
必要なパーティションキーを使用して新しいベクトルインデックスを作成します。
VectorIndexUpdatesパラメータのCreateアクションでUpdateTableAPI を使用します。新しいインデックスに別の名前を付けます。手順については、「ベクトルインデックスの既存テーブルへの追加」を参照してください。 -
新しいインデックスがバックフィルを完了するまで待ちます。
DescribeTableを呼び出し、IndexStatusがACTIVEで、Backfillingがfalseであることを確認します。 -
新しいインデックスに
SearchVectorsリクエストを送信するように、アプリケーションを更新します。パーティションキーの値をSearchConditionExpressionに含めます。詳細については、「SearchConditionExpression を使用したフィルタリング」を参照してください。 -
正しい結果を確認したら、古いインデックスを削除してストレージ料金の発生を停止します。
VectorIndexUpdatesパラメータのDeleteアクションでUpdateTableAPI を使用します。手順については、「ベクトルインデックスの削除」を参照してください。
インデックスオペレーションはベーステーブルのデータには影響しません
ベクトルインデックスを作成または削除しても、ベーステーブルやその項目には影響しません。DynamoDB は、バックフィル中にベーステーブルの項目からベクトルデータを再取得します。