DynamoDB は地理空間クエリに対応していますか?
ネイティブには対応していません。DynamoDB には地理空間のデータ型も、距離やバウンディングボックスの演算子もありません。地理空間クエリは代わりにモデリングのパターンです。近い地点どうしが並んで整列するように geohash や S2 セル ID をキーに格納し、検索範囲を覆うセルをクエリして、正確な距離での絞り込みはアプリケーション側で行います。
geohash のパターン
geohash(あるいは AWS の Geo Library for DynamoDB が使う S2 セル ID)は、緯度経度を文字列や数値にエンコードします。その プレフィックス がグリッドのセルを示し、決定的に重要なことに、近い地点どうしはプレフィックスを共有します。これをパーティションキーやソートキーとして格納すると、「自分の近くの地点」が普通のキー範囲クエリになります。
- 矩形クエリ — 矩形を覆うセルを計算し、各セルを
Queryして結果をマージします。 - 半径クエリ — 同じ手順を円を覆うセルに対して行い、その後クライアント側で正確な距離によりフィルタします。
解像度が重要です。ほとんどの検索が対象セルとその隣接セルだけで済むセルサイズを選びましょう。
精度がクエリ数をどう変えるか
エッフェル塔、48.8584, 2.2945 を例にします。その geohash は u09tunquc です。640 m 離れたトロカデロは 48.8619, 2.2876 にあり、u09tup1c0 です。両者は u09tu を共有するので、精度 5 では同じセルに入ります。精度 6 では入りません。互いに見える距離にある 2 つのランドマークが別々のセルに入るわけで、だからこそセルのクエリは常に自分のセルに加えて 8 つの隣接セルも含めなければなりません。
1 文字ごとにボックスは狭まります。この緯度では次のようになります。
| 精度 | セルサイズ | 半径 5 km が触れるセル数 |
|---|---|---|
| 4 | 25.7 × 19.6 km | 1〜4 |
| 5 | 3.2 × 4.9 km | 10〜12 |
| 6 | 0.81 × 0.61 km | 185〜193 |
各行が範囲になっているのは、その数が円の大きさだけでなく、円がグリッドのどこに落ちるかにも依存するからです。セルは赤道に近づくほど横に広がります。経度 1 度がより長い距離をカバーするからです。同じ精度 5 のセルでも、赤道では幅 4.9 km、パリでは 3.2 km です。
設計上の判断はその 3 列目です。精度 6 は「半径 5 km 以内のレストラン」1 件をおよそ 190 回の Query に変えます。精度 4 なら 1〜2 回の呼び出しで済みますが、500 km² のボックス内のすべてが返ってきて、クライアント側で捨てることになります。
痛いのはお金ではありません。その 190 回のクエリは、それぞれ 4 KB 未満を結果整合性で返すので合計 95 読み取りユニット、us-east-1 のオンデマンド料率で 1 回の検索あたり約 0.000012 ドル、100 万回で 11.88 ドルです。本当のコストはラウンドトリップです。並行に発行してファンアウトに上限を設けましょう。さもないと、検索エンドポイントの p99 は、たまたまいちばん遅かったセルクエリで決まります。
ライブラリとツール
AWS は S2 ベースのパターンを示す Geo Library for Amazon DynamoDB(Java)を公開しており、他言語へのコミュニティ移植(Node.js 向けの dynamodb-geo など)も存在します。採用前に保守状況を確認してください。パターン自体は直接実装できるくらい単純です。
検索エンジンを使うべきとき
リッチな地理述語(ポリゴン、距離順のソート、地理と全文検索の組み合わせ)が必要なら、テーブルを専用のインデックスに複製しましょう。全文検索を扱うのと同じ zero-ETL の OpenSearch 統合が、ネイティブの地理空間クエリを備えた検索エンジンも与えてくれます。
さらに詳しく
このパターンは本質的にソートキーの技法です。ソートキー戦略ガイドが道具箱を扱い、式ビルダーがセルのクエリで使う begins_with/BETWEEN 条件を生成し、DynoTableなら実際のアイテムでエンコード済みのキーを確認できます。
参考資料
- Geo Library for Amazon DynamoDB – Part 1: Table Structure — AWS Mobile Blog
- Implementing geohashing at scale in serverless web applications — AWS Compute Blog
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
geohash、セルの寸法、カバーするセル数は 2026-07-28 に、緯度 48.8584 で標準の base32 geohash エンコーダを用いて算出しました。u09tunquc は任意の geohash ツールで確認できます。検索あたりのコストには、同期済みの料金テーブルにある us-east-1 のオンデマンド読み取り料率(AWS 料金 API 2026-07-22 公開)を使っています。