DynamoDB は全文検索に対応していますか?
いいえ、ネイティブには対応していません。DynamoDB に全文検索はありません。関連度ランキングも、ステミングも、あいまい一致もありません。組み込みの文字列ツールは、完全一致の比較、ソートキーに対する begins_with、そして contains による部分文字列フィルターです。AWS の答えは Amazon OpenSearch Service とのゼロ ETL 統合で、テーブルを検索インデックスへ複製し、全文検索、ベクトル検索、セマンティック検索を可能にします。
ネイティブにできること
- ソートキーに対する
begins_with— 1 つのパーティション内での効率的な前方一致。階層的なソートキーモデルの背骨です。 - フィルター式の中の
contains— 部分文字列の一致。ただしフィルターは読み取りの 後 に走るので、Scan では調べたアイテムすべての読み取り費用を払うことに変わりありません。これが許容できる場面についてはフィルタリング戦略ガイドを参照してください。
どちらも結果に順位を付けず、打ち間違いを許さず、単語の境界も理解しません。これらは検索ではなく文字列の述語です。
同じクエリを 4 通り、計測してみる
商品タイトルを含む 100 アイテム(84 KB)を投入し、検索語だけを変えてテーブルを 4 回スキャンしました。
| フィルター | Count | ScannedCount | 読み取りユニット | 一致したもの |
|---|---|---|---|---|
contains(title, "run") | 3 | 100 | 11 | Shoes for runs · Trail running shoe · Sneaker, runner grade |
contains(title, "Run") | 2 | 100 | 11 | Running shoes · Rungs for a ladder |
contains(title, "running") | 1 | 100 | 11 | Trail running shoe |
contains(title, "runing") | 0 | 100 | 11 | なし |
これらの行は、入力欄に打ち込むユーザーの目で読んでください。"run" は Running shoes と RUNNING SHORTS を取り逃します。比較が大文字小文字を区別するからです。"Run" は Running shoes を拾い直しますが、RUNNING SHORTS はやはり取り逃し、そのうえ Rungs for a ladder を引きずり込みます。部分文字列には単語がどこから始まるかという発想がないからです。このクエリをどう大文字小文字を変えても、3 つすべてには届きません。1 文字落とせば何も返りません。degrade する先のあいまい一致が存在しないからです。
お金がかかるのは最後の列です。どのスキャンも 11 読み取りユニットを消費しました。1 件も一致しなかったものも含めてです。フィルターが読み取りの後に走るからです。AWS ははっきりこう述べています。"A filter expression is applied after a Scan finishes but before the results are returned. Therefore, a Scan consumes the same amount of read capacity, regardless of whether a filter expression is present." 上のような形についての AWS 自身の診断はこうです。"A high ScannedCount value with few, or no, Count results indicates an inefficient Scan operation."
つまり検索の値段はカタログの大きさに追随し、クエリの具体性には決して追随しません。これを逐次検索の入力欄につなげば、"running shoes" は 1 件を返すためにキー入力 1 回ごと、計 13 回テーブル全体を課金します。
AWS ネイティブな答え、OpenSearch へのゼロ ETL
OpenSearch Ingestion の DynamoDB プラグインは、テーブルを 1 つ以上の OpenSearch インデックスへ同期します。初回のスナップショットは DynamoDB の S3 エクスポート(PITR が必要)で読み込まれ、その後 DynamoDB Streams がほぼリアルタイムで変更を複製します。このパイプラインはテーブルの読み取り・書き込みスループットを一切消費しないので、本番トラフィックの隣に置いても安全です。そして AWS は、この統合によって DynamoDB のデータに対する全文検索、ベクトル検索、セマンティック検索が可能になると述べています。
さらに詳しく
その「検索」が実は既知の検索であるなら、代わりにモデルを直しましょう。フィルタリング戦略とソートキー戦略のガイドが、キーに何ができるかを示します。begins_with や contains の条件は式ビルダーで試作でき、探索しながら実テーブルのデータをフィルターするにはDynoTable をダウンロードしてください。
参考資料
- DynamoDB zero-ETL integration with Amazon OpenSearch Service — Amazon DynamoDB Developer Guide
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
- Comparison operator and function reference — Amazon DynamoDB Developer Guide
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
この 4 回のスキャンは 2026-07-28 に、Node v24.18.0 上の @aws-sdk/client-dynamodb 3.1095.0 で DynamoDB Local 3.3.0 に対して実行しました。Count、ScannedCount、読み取りユニットはエンジン自身の数値です。