MongoDB で複雑な全文検索や AI 主導のベクトル検索を実装する場合、Elasticsearch などの別の検索エンジンが必要になることがよくあります。これにより、アーキテクチャの複雑さ、データ同期の課題、および運用上のオーバーヘッドが増加します。
MongoDB Search 機能は、専用の検索ノード (mongot) を MongoDB インスタンスに統合し、シームレスな全文検索およびベクトル検索機能を提供します。これにより、使い慣れた MongoDB Query Language (MQL) を使用して、外部システムを管理することなくマルチモーダル検索タスクを実行でき、開発を簡素化し、運用上の負担を軽減できます。
課金 (無料トライアル)
MongoDB Search 機能は現在、招待制プレビュー中です。フォームに記入することで無料トライアルに申し込むことができます。無料トライアル期間中、mongot 検索ノードには課金されません。プライマリ MongoDB インスタンスの料金のみを支払う必要があります。
適用範囲
MongoDB 8.0 のレプリカセット専用インスタンスでのみ利用可能です。現在、シャードクラスターはサポートされていません。
パブリッククラウドリージョンでのみ利用可能です。
仕組み
MongoDB Search は、専用の mongot 検索ノードをインスタンスに追加することで、検索ワークロードを分離します。このアーキテクチャ上の分離により、集中的な検索タスクがコアデータベース (mongod ノード) のパフォーマンスに影響を与えるのを防ぎます。
コアアーキテクチャ:
mongotノードは、$search(全文検索) および$vectorSearch(ベクトル検索) リクエストの処理専用の独立した計算リソースです。データ同期: mongot ノードは、Change Streams を使用して mongod ノードから oplog を非同期にレプリケートし、検索インデックスを最新の状態に保ちます。これにより、結果整合性が保証されます。
クエリルーティング: 集計クエリに
$searchまたは$vectorSearchが含まれている場合、mongosは検索部分をmongotノードにルーティングして実行します。検索結果は、mongodノードからの通常のクエリの結果とマージされ、統一された結果セットが返されます。
MongoDB Search の有効化
目的
既存の MongoDB インスタンスで MongoDB Search を有効にして、専用の mongot 検索ノードを作成できます。
手順
MongoDB ReplicaSet インスタンスページに移動します。上部のバーからリソースグループとリージョンを選択し、ターゲットインスタンスの ID をクリックします。
左側のナビゲーションウィンドウで、[MongoDB Search] をクリックします。
[MongoDB Search] ページで、[今すぐ有効化] をクリックします。
[検索のアクティベート] パネルで、[検索ノードの仕様] を構成します。
パラメーター
説明
仕様
mongot検索ノードに適した計算仕様を選択します。予想される秒間クエリ数 (QPS) とデータの複雑さに基づいて選択してください。ストレージ
mongotノードにディスク領域を割り当てて、検索インデックスを保存します。この領域は、プライマリインスタンスのストレージとは別です。ソースデータの量とインデックスの複雑さに基づいて必要な領域を見積もり、予備の容量を残しておきます。検索ノードの仕様とストレージサイズは、プライマリインスタンスのもの以上になるように設定してください。実際のワークロードに基づいて、後で構成を変更できます。
[サービス契約] を読んで選択します。
[今すぐ支払う] をクリックします。
ノードが作成された後、[MongoDB Search] ページで新しい検索ノード情報を表示し、[アップグレード/ダウングレード]、[再起動]、および [リリース] 操作を実行できます。
MongoDB Search ノードの管理
[MongoDB Search] ページでは、作成された検索ノードに対して次の操作を実行できます。
アップグレード/ダウングレード: ビジネスの変更に対応するために、
mongotノードの計算仕様またはストレージ領域を調整できます。検索ノードの数は 2 つで、変更することはできません。再起動: 問題のトラブルシューティングや特定の構成を適用するために、
mongotノードを再起動できます。再起動中、検索サービスは短時間利用できなくなります。リリース: Search 機能が不要になった場合、
mongotノードをリリースできます。重要リリース操作は、作成されたすべての検索インデックスを永久に削除し、元に戻すことはできません。
検索インデックスの作成と使用
目的
さまざまな種類の検索インデックスを作成することで、全文検索またはベクトル検索を有効にできます。すべての操作は、MongoDB Shell (mongosh) または互換性のある MongoDB ドライバーを使用して実行されます。
前提条件
mongosh またはアプリケーションを介して、ターゲットの MongoDB インスタンスに接続していること。
例 1: 製品レビューの全文検索を実装する
この例では、reviews コレクションに全文検索インデックスを作成し、キーワードクエリを実行する方法を示します。
動的マッピングで検索インデックスを作成します。
dynamic: trueは、コレクション内のすべてのフィールドに自動的にインデックスを付けるように MongoDB を構成します。これは、迅速なプロトタイピングに最適です。// 'reviews' コレクションに 'reviews_full_text_index' という名前の検索インデックスを作成します db.reviews.createSearchIndex({ name: "reviews_full_text_index", definition: { "mappings": { "dynamic": true } } });特定のキーワードを含むレビューをクエリするために、
$search集約ステージを使用します。 次のクエリは、commentフィールドに "good" が含まれるレビューを検索し、コメント、評価、および製品 ID を返します。db.reviews.aggregate([ { $search: { index: "reviews_full_text_index", // 使用する検索インデックスを指定します text: { query: "good", // クエリキーワード path: "comment" // 'comment' フィールドで検索します } } }, { $limit: 5 }, { $project: { _id: 0, productId: 1, rating: 1, comment: 1, score: { $meta: "searchScore" } // 検索関連性スコアを返します } } ]);
例 2: 画像の特徴に基づいた画像による検索を実装する
この例では、images コレクションのベクトル検索インデックスを作成し、画像ベクトル特徴に対して類似検索を実行する方法を示します。
ベクトル検索インデックスを作成します。ベクトルフィールドのパス、ディメンション数 (
numDimensions)、および類似度メソッド (similarity) を指定する必要があります。// 'images' コレクションに 'vector_index' という名前のベクトルインデックスを作成します db.images.createSearchIndex( "vector_index", "vectorSearch", { "fields": [ { "type": "vector", "path": "plot_embedding_voyage_3_large",// ベクトルを格納するフィールド "numDimensions": 2048,// ベクトルのディメンション数 "similarity": "dotProduct",// 類似度計算メソッド "quantization": "scalar" } ] } );$vectorSearch集約ステージを使用して、特定の画像に最も類似した画像を見つけることができます。 クエリベクトル (queryVector) を提供する必要があります。これは通常、入力画像に基づいて AI モデルによって生成されます。numCandidates: 候補セットのサイズ。このパラメーターは、パフォーマンスと取得率の間のトレードオフを表します。値が大きいほど取得率は向上しますが、より多くのリソースが必要になり、レイテンシが増加する可能性があります。// QUERY_EMBEDDING は AI モデルによって生成された 1024 次元のベクトルであると仮定します const QUERY_EMBEDDING = [0.12, 0.45, -0.23, ...]; // ベクトルの例。実際のベクトルデータに置き換えてください。 // ベクトル類似性に基づいて検索を実行します。 db.images.aggregate([ { "$vectorSearch": { "index": "vector_index", "path": "plot_embedding_voyage_3_large", "queryVector": QUERY_EMBEDDING, "numCandidates": 150, "limit": 10, "quantization": "scalar" } }, { "$project": { "_id": 0, "plot": 1, "title": 1, "score": { $meta: "vectorSearchScore" } } } ])
本番稼働
監視と O&M
監視メトリック:
mongot検索ノードには専用の監視メトリックはありません。プライマリインスタンスの CPU、メモリ、I/O、およびネットワークメトリックを観察することで、検索ワークロードの影響を測定できます。ログ管理: 現在、
mongotノードで実行ログ、スロークエリログ、または監査ログを表示することはできません。スロークエリについては、explain()メソッドを使用して$searchまたは$vectorSearchステージの実行計画を分析し、パフォーマンスのボトルネックを特定できます。インデックス管理:
db.collection.getSearchIndexes()コマンドを使用して、既存の検索インデックスとそのステータスを表示できます。
高可用性とフェールオーバー
検索ノードは、デフォルトで 2 ノードアーキテクチャでデプロイされます。1 つのノードに障害が発生した場合、システムは自動的にフェールオーバーを実行し、正常なノードにトラフィックをルーティングします。アプリケーションにリトライメカニズムがあることを確認してください。
バックアップ、リカバリ、およびデータ同期
バックアップとリカバリ: バックアップファイルから復元された新しいインスタンスには、元のインスタンスの検索インデックスは含まれません。新しいインスタンスで検索サービスを有効にし、すべての検索インデックスを再構築する必要があります。
データ移行: Data Transmission Service (DTS) などのツールを使用してデータ移行または同期を行う場合、検索インデックスは同期されません。宛先インスタンスで手動でインデックスを作成する必要があります。
よくある質問
Q: データを書き込んでから検索できるようになるまで、どのくらい時間がかかりますか?
A: データ同期は非同期です。通常、数秒以内にデータを検索できます。レイテンシーは、インスタンスの書き込み負荷、ドキュメントサイズ、ネットワーク条件などの要因に影響されます。
Q: インデックスの再構築をトリガーするものは何ですか?アップグレードまたはダウングレードはインデックスの再構築をトリガーしますか?
A: インデックス定義を変更すると、mongot はバックグラウンドで新しいインデックスを自動的に再構築します。このプロセス中、古いインデックスは引き続きクエリを処理できます。新しいインデックスが構築されると、古いインデックスは利用できなくなります。検索ノードのアップグレードまたはダウングレードは、インデックスの再構築に直接関係ありません。