Amazon DynamoDBをアプリケーションのデータストアとして利用しながら、商品検索やレコメンデーション、AIエージェントの長期記憶などにベクトル検索を追加する場合、これまではAmazon OpenSearch ServiceやAmazon Bedrock Knowledge Basesなどの検索基盤を別に用意する構成が一般的でした。DynamoDBのデータを別サービスへ同期するため、検索基盤だけでなく、データ連携と整合性も管理する必要があります。
2026年8月5日、AWSはAmazon DynamoDBのネイティブベクトル検索を一般提供しました。ベクトル埋め込みを通常の属性と一緒にDynamoDBへ保存し、専用のベクトルインデックスに対して類似度検索を実行できる機能です。別のベクトルストアへデータを複製せず、業務データとベクトルを同じサービスで扱えるようになりました。
本記事では、DynamoDBのネイティブベクトル検索によって何が変わるのか、機能の仕組み、主な用途、他のAWSサービスとの使い分け、設計上の注意点を整理します。実際にAWS マネジメントコンソールでDynamoDBテーブルとベクトルインデックスを作成し、Pythonから検索する手順は次回紹介します。
ベクトル検索の前提となるエンベディングの仕組みは、以下の記事で解説しています。
従来、DynamoDBに保存した商品や文書を意味の近さで検索するには、DynamoDB StreamsやOpenSearch Ingestionなどを利用して、検索用のベクトルや関連属性を別サービスへ同期する構成が必要でした。この構成は、全文検索や高度なハイブリッド検索を実現できる一方、DynamoDBと検索インデックスの双方を管理する必要があります。
DynamoDBのネイティブベクトル検索では、ベクトルをDynamoDBのアイテム内に保存し、そのテーブルに作成したベクトルインデックスを直接検索します。検索結果にはインデックスへ射影した商品名や説明などの属性も含められるため、検索後にIDを使って元データを取得し直す処理も省略できます。
| 観点 | 従来のDynamoDBと外部検索基盤 | DynamoDBネイティブベクトル検索 |
|---|---|---|
| 業務データ | DynamoDBに保存 | DynamoDBに保存 |
| ベクトル | OpenSearch Serviceなどへ複製 | DynamoDBのアイテムに保存 |
| 検索インデックス | 外部サービスで作成 | DynamoDBテーブルに作成 |
| データ同期 | Streamsや取り込みパイプラインが必要 | 外部サービスへの同期は不要 |
| 検索後の属性取得 | 元データの再取得が必要な場合がある | 射影した属性を検索結果に含められる |
| 運用対象 | データベースと検索基盤 | DynamoDBを中心に管理 |
なお、OpenSearch Serviceが不要になったということではありません。全文検索、キーワードとのハイブリッド検索、複雑な集計、検索品質の詳細な調整が必要な場合は、引き続きOpenSearch Serviceが有力です。DynamoDBに業務データがあり、類似度検索を低い運用負荷で追加したい場合に、新しい選択肢が加わったと捉えるのが適切です。
DynamoDBでは、埋め込みモデルが生成したベクトルを既存のList型で保存します。リストの各要素はNumber型の値であり、ベクトル専用の新しい属性型を使用するわけではありません。
ベクトルを保存する属性に対してベクトルインデックスを作成し、次元数と距離関数を設定します。アプリケーションは検索文を同じ埋め込みモデルでベクトル化し、SearchVectors APIへ渡します。DynamoDBは近似最近傍検索(ANN)を実行し、類似度の高いアイテムをスコア順に返します。

ベクトルインデックスの構成要素は、DynamoDB開発者ガイド「Using vector indexes in DynamoDB」で確認できます。
DynamoDBでは、次の3種類の距離関数を選択できます。インデックス作成後に距離関数を変更できないため、埋め込みモデルの推奨設定に合わせて選ぶことが重要です。
| 距離関数 | スコアの見方 | 主な用途 |
|---|---|---|
| COSINE | 小さいほど類似し、0は同じ方向を表す | テキストの意味検索、RAG、FAQ検索 |
| DOT_PRODUCT | 大きいほど類似する | ベクトルの大きさも順位に反映したいレコメンデーション |
| EUCLIDEAN | 小さいほど距離が近い | 類似画像検索、クラスタリング、異常検知 |
テキスト埋め込みで判断に迷う場合、AWSの開発者ガイドではCOSINEが安全な既定の選択肢として案内されています。単位ベクトルへ正規化した場合、DOT_PRODUCTとCOSINEは同じ順位になりますが、スコアの意味は異なります。
ベクトルインデックスには、任意で検索スキーマを設定できます。検索スキーマには、ルーティングキーとインラインフィルター属性を定義します。ルーティングキーは、AWS公式ブログや開発者ガイドで「ベクトルインデックスのパーティションキー」と説明されている設定に相当します。
ルーティングキーを設定すると、検索対象を1つのキー値に限定できます。たとえば、テナント、国、マーケットプレイスなどをキーにすれば、検索するデータ量を抑え、キー値ごとに検索スループットを分散できます。ルーティングキーを定義したインデックスでは、検索時にその値の指定が必須です。

インラインフィルターは、ベクトルの類似度検索と同時にカテゴリなどの条件を適用する機能です。現在は等価演算子のみをサポートし、範囲条件やIN条件には対応していません。
| 項目 | 内容 |
|---|---|
| 最大次元数 | 4,096次元 |
| 1回の検索で返す件数 | 最大100件 |
| 1インデックスのインラインフィルター | 最大18属性 |
| 1テーブルのベクトルインデックス | デフォルトで最大5個 |
| 容量モード | オンデマンドのみ |
| 検索API | SearchVectors |
| 検索結果の上限 | 16MB、ページネーションなし |
| インデックス更新 | ベーステーブルへの書き込みを自動同期 |
最新のクォータと機能上の制約については、DynamoDB開発者ガイドの「Vector indexes」および「Requirements and limitations」を確認してください。インデックスの更新動作については、「Data synchronization between tables and vector indexes」を参照してください。
ベクトルインデックスはQuery、Scan等では検索できません。また、DynamoDB Accelerator(DAX)はSearchVectorsに対応していないため、ベクトル検索はDynamoDBへ直接送信します。
DynamoDBのベクトル検索は、頻繁に更新される業務データと意味検索を同じデータモデルで扱いたい用途に適しています。
たとえば商品検索では、商品ID、名称、価格、在庫、カテゴリ、説明文のベクトルを1つのアイテムに保存できます。価格、在庫、カテゴリなどの属性を更新すると、変更内容はベクトルインデックスへ自動的に同期されます。
ただし、DynamoDBは埋め込みを再生成しません。説明文など、ベクトルの元となるデータを変更した場合は、アプリケーション側で埋め込みを再生成し、ベクトル属性も更新する必要があります。埋め込みの更新については、DynamoDB開発者ガイドの「Keep embeddings in sync with source content」も参照してください。
外部検索基盤との削除漏れや更新遅延を考慮する箇所が減る点は、更新頻度が高いデータで特に有効です。
一方、RAGの検索設計では、ベクトル検索だけで十分とは限りません。型番、正式名称、日付などの完全一致が重要な場合は、テキスト検索や構造化検索との組み合わせも検討する必要があります。検索方式の違いは、以下の記事で整理しています。
AWSには複数のベクトル検索の選択肢があります。データの所在、検索機能、レイテンシー、更新頻度、運用方法に応じて選択します。
| 選択肢 | 適している用途 | 考慮点 |
|---|---|---|
| DynamoDB | DynamoDBの業務データを低レイテンシーで類似検索する用途 | フィルターは等価条件であり、全文検索やハイブリッド検索は別途検討する |
| OpenSearch Service | 全文検索、ベクトル検索、ハイブリッド検索、検索品質の詳細な調整 | DynamoDBを元データとする場合は同期構成が必要になる |
| S3 Vectors | 大量のベクトルを耐久性のあるストレージへ低コストで保存・検索する用途 | 業務トランザクションのデータストアとは役割が異なる |
| PostgreSQLとpgvector | SQL、結合、トランザクションとベクトル検索を組み合わせる用途 | PostgreSQLのデータモデルと運用を前提に設計する |
DynamoDBをすでにプライマリデータストアとして利用しており、検索要件がベクトル類似度と等価フィルターで満たせる場合は、ネイティブ機能によって構成を簡素化できます。反対に、検索がアプリケーションの中心であり、全文検索や複数方式のスコア統合が必要な場合は、OpenSearch Serviceを候補に残すべきです。
テーブルへの書き込み後、ベクトルインデックスは非同期に更新されます。そのため、新規登録や更新の直後は、対象アイテムが検索結果へ現れない可能性があります。「保存完了と同時に必ず検索できる」ことが必要な処理では、再試行や状態管理を設計に含めます。
小規模な検証では、ルーティングキーを持たないベクトルインデックスでも検索できます。しかし、インデックス全体を対象とするため、データ量と検索量が増えると処理量、レイテンシー、コストが増加します。
テナントIDやマーケットプレイスのように、すべての検索で必ず指定できる属性があれば、ルーティングキーとして検討します。値の偏りが大きい属性を選ぶと特定のキーへ負荷が集中するため、実際のアクセスパターンを基準に決定します。
ベクトルインデックスの属性の射影には、ALL、KEYS_ONLY、INCLUDEの3種類があります。コンソールでは、それぞれ「All」「Only keys」「Include」と表示されます。
| 射影タイプ | 射影される属性 | 検索後の処理 |
|---|---|---|
| ALL | すべてのテーブル属性 | ベクトル検索の結果だけで詳細情報を取得できる |
| KEYS_ONLY | ベーステーブルとインデックスのキー、およびベクトル検索に必要な属性 | 返された主キーを使い、必要に応じてベーステーブルから詳細情報を取得する |
| INCLUDE | KEYS_ONLYの属性に加えて、指定した非キー属性 | 指定した属性はベクトル検索から直接取得できる |
ALLは実装が簡単ですが、アイテムが大きい場合はインデックスのストレージと検索時に処理するデータ量が増えます。KEYS_ONLYはインデックスを小さくできますが、商品名や説明文などを表示するには、検索結果の主キーを使ったGetItemやBatchGetItemが別途必要です。検索結果の表示や後続処理に必要な属性が決まっている場合は、必要な属性だけをINCLUDEで射影する方法を検討します。
ベクトル属性はベクトルインデックスへ必ず射影されます。SearchVectors APIでProjectionExpressionを省略すると、ベクトルを含む射影済み属性がすべて返されます。必要な属性だけを指定すると、レスポンスサイズと返却データ量に応じた検索コストを抑えられます。ただし、検索時に調べるデータ量は変わりません。その削減には、ルーティングキーによる検索範囲の限定が有効です。
ベクトルインデックスでは、ベーステーブルの通常料金に加えて、次の3つが課金対象です。
書き込みと検索はバイト単位で計測され、1回あたり1KBの最小課金サイズがあります。次元数を抑える、不要な属性を射影しない、ルーティングキーで検索範囲を限定するといった設計は、ストレージ、書き込み、検索の複数のコストへ影響します。
単価はリージョンやテーブルクラスによって異なるため、見積もり時はAmazon DynamoDBの料金を確認してください。
次元数、距離関数、射影、検索スキーマは、ベクトルインデックス作成後に変更できません。変更する場合は、新しい設定で別のベクトルインデックスを作成します。既存テーブルに追加したベクトルインデックスは、既存データのバックフィルが完了するまでSearchVectorsを実行できません。新旧インデックスの切り替え手順と検証期間は事前に計画する必要があります。
DynamoDBのネイティブベクトル検索により、ベクトル埋め込みと業務データを同じテーブルへ保存し、SearchVectors APIで直接類似度検索を実行できるようになりました。外部ベクトルストアへの同期が不要になるため、DynamoDBを中心とするアプリケーションでは、構成とデータ管理を簡素化できます。
導入時の要点は次のとおりです。
次回は、AWS マネジメントコンソールからDynamoDBテーブルとベクトルインデックスを作成し、Amazon BedrockとPythonを使って商品データの登録、通常のベクトル検索、フィルター付き検索を実行します。
Tech Funでは、お客様のフェーズに合わせ、生成AI活用に向けた様々な支援をご提供しています。
生成AIに限らず、Web・業務システム開発やインフラ設計など、技術領域を問わずご相談を承っています。「何から始めれば良いか分からない」という段階でも構いませんので、ぜひお気軽にお問い合わせください。