Analytics

Amazon OpenSearch Service

ベクトル専用DBではなく「全文検索エンジンにベクトル索引が同居している」ストア。AIP-C01 では D1 のベクトルストア選定とハイブリッド検索の分岐で、既定の正解になりやすい側です。

  • A|GenAIの核
  • D1 FM統合・データ・コンプラ
  • D4 運用効率と最適化
  • D5 テスト・検証・トラブルシュート

ひとことで言うと

全文検索エンジンのドキュメントの中に、ベクトル(knn_vector フィールド)が同居しているストアです。1件のドキュメントが本文テキスト・数値・日付・geo_point とベクトルを同時に持つので、意味の近さと構造的な条件を1回のクエリで併せて効かせられます。

要するに、ベクトルDBではなく検索エンジンです。公式のフィルタ例がそのまま性格を表しています——「このベクトルに近い物件で、かつ price が 3000 以下で、かつ指定座標から100マイル以内」を1本の knn クエリで書けます。
ベクトル専用ストアは「意味が近い順」しか返せません。OpenSearch が試験で勝つのは、キーワード・メタデータ・地理条件がベクトルと同じ土俵に乗っている場面です。

なぜ生まれたか

ベクトル検索のために別のデータベースを立てると、同じ文書が2箇所に分裂します。本文とメタデータは検索エンジン、ベクトルはベクトルDB。すると「意味が近くて、かつ部署が engineering のもの」を出すのに、両方を叩いて突き合わせるアプリ側のコードが要ります。公式が「データ型を同じ場所に置くこと(colocating the data types)が複雑さを減らし、データの二重持ち・バージョン互換・ライセンスの問題を避ける」と書いているのは、この分裂への回答です。

もう1つは運用の重さです。プロビジョンドのドメインはインスタンス数・シャード・メモリを自分で決めます。OpenSearch Serverless はここを分解し、インデックス(取り込み)とサーチ(検索)のコンピュートを分離して、インデックスの実体を S3 に置く構成にしました。取り込みと検索を別々にスケールでき、リソースの取り合いも起きません。

自前で組むと出てくる不便OpenSearch 側の受け皿
ベクトルとメタデータが別ストアに分かれる同じインデックスに knn_vector と text / long / geo_point を同居させる
埋め込み生成をアプリ側で書くAI コネクタ(Amazon Bedrock / SageMaker AI / Hugging Face / 自前モデル)と取り込みパイプラインで、検索エンジン側に寄せる(OpenSearch 2.9 以降の semantic search)
パイプラインの設定自体が面倒2.19 以降の automatic semantic enrichment が、テキストフィールドのスパースエンコーディングを自動生成する
クラスタのサイジングとシャード設計OpenSearch Serverless(インデックスとサーチのコンピュートを分離し、S3 を一次ストレージにする)
使っていない時間も課金が続くNextGen ベクトル検索コレクションは、アイドル時にインデックスもサーチも 0 までスケールする

何に使うか

用途使い方関連する試験ドメイン
RAG のベクトルストアOpenSearch Serverless の vector search コレクション、またはプロビジョンドドメインの k-NN インデックスを Bedrock Knowledge Bases のベクトルストアに指定するD1
ハイブリッド検索キーワード(生テキスト)とベクトルを併用する。Bedrock KB からは overrideSearchType: HYBRIDD1 / D4
フィルタ付きセマンティック検索knn クエリの filter に range / geo_distance / query_string を入れるD1
埋め込み生成の内製化AI コネクタで Bedrock / SageMaker AI のモデルを呼び、取り込み時にベクトル化するD1 / D2
検索品質・レイテンシの監視CloudWatch のドメインメトリクス(k-NN の統計を含む)D4 / D5
コスト階層化UltraWarm / コールドストレージ(読み取り専用データ向け)。k-NN インデックスは 2.17 以降のドメインで移行できるD4

試験でどう問われるか

D1(配点31%)の「ベクトルストア設計」「検索設計」の中心にいます。問われ方は「OpenSearch とは何か」ではなく、Aurora pgvector・S3 Vectors・Neptune Analytics・マネージド Knowledge Base と並べて、どれを選ぶかです。分岐を作っている条件は、ほとんどが公式が明記している対応・非対応なので、そこを覚えれば取れます。

問われ方正解に寄る条件引っかけの選択肢
Bedrock KB でハイブリッド検索を使いたい公式が対応と明記しているのは Amazon RDS(Aurora)・OpenSearch Serverless・MongoDB で、しかもフィルタ可能なテキストフィールドを持つ場合に限られます。それ以外のストアではクエリはセマンティック検索に落ちますPinecone / Redis Enterprise Cloud / S3 Vectors / Neptune Analytics を選ばせる。「ハイブリッドにしたい」と書いてあるのにストアがこれらなら、その選択肢は成立しません
メタデータフィルタが効かないベクトルインデックスのエンジンが nmslib になっている。faiss で作り直す(または Bedrock にインデックスを自動作成させる)「IAM 権限を追加する」「次元数を変える」
Serverless でコレクションを作るvector search コレクションを選ぶ。search / time series コレクションでは k-NN 型インデックスが作れません。コレクション型は作成後に変更できません「全文検索も要るので search コレクションにする」(k-NN が使えず詰みます)
バイナリ埋め込みを保存したい公式が「バイナリベクトルを保存できる唯一のストア」と書いているのが OpenSearch Serverless と OpenSearch マネージドクラスタですS3 Vectors(浮動小数点のみと明記)/Aurora
KB のベクトルストアにマネージドドメインを使うネットワークは Public access が必須。VPC の中に置いたドメインは Knowledge Base ではサポートされません「セキュリティ要件があるので VPC 内に置く」(要件としては正しく見えるが、この構成では通りません)
KB のドメインのバージョンk-NN インデックスの作成に 2.13 以上、バイナリ埋め込みを使うなら 2.16 以上「最新でなくても動く」
startsWith でメタデータを絞りたい公式が「OpenSearch Serverless のベクトルストアでのみサポート」と書いていますAurora / S3 Vectors(S3 Vectors は startsWith と stringContains が使えないと明記)
チャンク戦略・リランクを自分で組みたい取り込みパイプラインと検索パイプラインを自分で持てる OpenSearch を直接使うBedrock Knowledge Bases(パイプラインを預ける側なので、細かい介入の要件とは向きが逆)
埋め込みモデルを検索エンジン側から呼びたいAI コネクタ(Bedrock / SageMaker AI)+ neural search。2.9 以降Lambda を書いて自前でベクトル化する(できますが、要件が「設定で済ませたい」ならこちらは外れます)
コスト(D4)アイドル時間が長い/クエリが疎 → NextGen コレクションの 0 スケールと32x 圧縮(既定)。読み取り専用の古いデータ → UltraWarm / コールドストレージプロビジョンドドメインのインスタンスを小さくする(止まらないので、疎なワークロードでは効きません)

「ハイブリッド検索」はこの試験で最も差が付く分岐です。シナリオに製品番号・型番・社内の略語・人名といった「意味では近づけない語」が出てきたら、それはベクトル単独では落ちる合図で、ハイブリッドを要求しています。そのときストア側がハイブリッドに対応していない選択肢は、他がどれだけ正しそうでも外れます——Bedrock KB では Aurora・OpenSearch Serverless・MongoDB の3つだけです。逆に「ハイブリッドにしたのに効かない」と書かれていたら、疑うのはフィルタ可能なテキストフィールドの有無です。

実務でどう使うか

  • k と size は両方指定します。 size を省くと、k 件は「クエリ全体で k 件」ではなくシャードごと・セグメントごとに k 件返ります。k の最大は 10,000 です
  • post_filter を併用すると、返る件数が k を下回ります。 公式の例でも 2件が1件に減っています。「絞り込むと結果が消える」の典型がこれです
  • 次元数の上限は、見ているページで数字が違います。 k-NN のページは knn_vector を「最大10,000個の float のリスト」、ベクトル検索とServerless のページは「16,000次元まで」と書いています。1つの数字を暗記して現場に持ち込まず、使う経路のドキュメントで確かめてください
  • Serverless の Classic と NextGen は別物です。 Classic は既定エンジンが nmslib、warmup / stats / モデル学習 API とインラインスクリプトが非対応、リフレッシュ間隔60秒。NextGen は engine / mode の指定自体が不要で、リフレッシュ間隔10秒、既定で 32x 圧縮(1x / 2x / 8x / 16x / 32x から選択可)、検索レスポンスから元ベクトルが既定で除かれます(_source: true で戻せます)。NextGen の 32x 圧縮インデックスでは radial search が使えません
  • 200 OCU を超えるスケールは AWS Support への申請が要ります(Classic のベクトル検索コレクションで、数百万〜十億規模のベクトルを扱う場合)
  • プロビジョンドドメインでは、グラフのメモリが静かに天井を打ちます。 OpenSearch Service はインスタンス RAM の半分を Java ヒープに使い(上限32GiB)、k-NN は既定でその残り半分の 50% まで使います。RAM 32GiB のインスタンスなら 8GiB(32×0.5×0.5) が目安で、KNNGraphMemoryUsage メトリクスがこれを超えると性能が落ちます
  • knn.memory.circuit_breaker.enabled と knn.circuit_breaker.triggered は OpenSearch Service では変更できません。 他の k-NN 設定は _cluster/settings から変えられます
  • ウォーム層に移した k-NN インデックスでは、キャッシュクリアとウォームアップ API がブロックされます。 最初のクエリで S3 からグラフを落としてメモリに載せる挙動になるので、移した直後の1発目が遅いのは仕様です

コレクション型は後から変えられません。「とりあえず search コレクションで作って、あとでベクトルも入れる」ができない設計です(search / time series では k-NN 型インデックスを作れません)。加えて、マネージドドメインから Serverless コレクションへの自動移行は存在せず、再インデックスが必要です。ここは PoC の入口で間違えると作り直しになります。

取り違えやすいもの

迷う相手切り分けの一言
Amazon Bedrock Knowledge BasesKB はパイプラインごと預ける側。OpenSearch は棚だけ貸す側。KB のベクトルストアとして OpenSearch を指定する構成もあるので、「対立」ではなく「層が違う」
Aurora(pgvector)既存の PostgreSQL 資産・トランザクション・JOIN があるなら Aurora。全文検索・ファセット・地理条件・大規模な k-NN が要るなら OpenSearch
Amazon S3 Vectors公式が「問い合わせ頻度が低いワークロードに向く」と書いている低コスト側。バイナリ埋め込み非対応・startsWith / stringContains 非対応。低レイテンシで叩き続けるなら OpenSearch
Neptune Analytics(GraphRAG)ベクトル索引を持つが本体はグラフ。関係をたどる検索が要件なら Neptune、類似度+条件なら OpenSearch
Amazon KendraKendra は索引と検索の中身を隠したマネージド検索。OpenSearch はインデックス設計を自分で握る。なお Kendra は2026年に新規顧客の受付を終了しています
OpenSearch Serverless(Serverless 内の型違い)vector search / search / time series は用途で分かれた別物。k-NN が要るなら vector search 一択

想起チェック

Q1. Bedrock Knowledge Bases で「キーワードと意味の両方で当てたい」。ベクトルストアの選択肢を3つに絞れますか。

Amazon RDS(Aurora)・OpenSearch Serverless・MongoDB の3つで、しかもフィルタ可能なテキストフィールドを持つ場合だけです。それ以外のストアでは、指定してもクエリはセマンティック検索として実行されます。

Q2. OpenSearch Serverless でベクトル検索を始めるとき、最初に間違えると取り返しがつかない選択は?

コレクション型です。vector search を選ばないと k-NN 型インデックスが作れず、しかも作成後に型は変更できません。search / time series では k-NN が使えません。

Q3. Bedrock KB でメタデータフィルタを設定したのに結果が絞れません。OpenSearch Serverless 側で最初に見る場所は?

ベクトルインデックスのエンジンが nmslib になっていないかです。faiss で作り直すか、Bedrock にインデックスを自動作成させます。

Q4. `knn` クエリで `k: 10` を指定したのに、想定よりずっと多く返ってきました。何を忘れましたか。

size の指定です。size を併記しないと、k はクエリ全体ではなくシャードごと・セグメントごとに効きます。

Q5. RAM 32GiB のインスタンスで k-NN グラフに使える目安の容量は? その根拠は?

約 8GiB です。RAM の半分が Java ヒープ(上限32GiB)に取られ、k-NN は既定でその残り半分の 50% までを使うため、32×0.5×0.5 になります。超過は KNNGraphMemoryUsage メトリクスで見ます。

出典(AWS公式)