Overview
MongoDB Search 機能を使用すると、Atlas でホストされているコレクションに対して全文検索を実行できます。MongoDB 検索クエリを実行する前に、インデックスを作成するフィールドとインデックスの作成方法を指定するインデックスを作成する必要があります。
MongoDB Search の詳細については、 MongoDB Search ドキュメントの「MongoDB Search の概要」を参照してください。
サンプル データ
このガイドの例では、Atlasサンプルデータセットのsample_mflixデータベース内のmoviesコレクションを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
C++アプリケーションから sample_mflixコレクションのMongoDB 検索インデックスを管理するには、まず Atlas クラスターに接続する mongocxx::client をインスタンス化し、次の値を db 変数と collection 変数に割り当てます。
auto db = client["sample_mflix"]; auto collection = db["movies"];
次に、collection 変数で search_indexes() メソッドを呼び出して、コレクションで mongocxx::search_index_view をインスタンス化します。
auto siv = collection.search_indexes();
mongocxx::search_index_viewクラスには、MongoDB Search 検索インデックスと交流することができる次のノード関数が含まれています。
create_one(): 指定された構成でMongoDBの検索インデックスを作成します
create_many(): 指定された構成で複数のMongoDB 検索インデックスを作成します
list(): コレクションのMongoDB 検索インデックスのリストをポイントする
mongocxx::cursorインスタンスを返しますupdate_one(): 指定されたMongoDB 検索インデックスの定義を更新します
drop_one() :コレクションから指定したインデックスを削除します
注意
MongoDB 検索インデックスマネジメントは非同期
MongoDB C++ドライバーは検索インデックスを非同期に管理します。次のセクションで説明されているライブラリ メソッドは、サーバー応答をすぐに返しますが、 MongoDB Search インデックスへの変更はバックグラウンドで行われ、しばらくが完了しないまで完了しない可能性があります。
次のセクションでは、MongoDB Searchの各検索インデックスマネジメントメソッドの使用方法を示すコード例を示します。
MongoDB Search インデックスの作成
コレクションに単一のMongoDB検索インデックスを作成するには、mongocxx::search_index_viewインスタンスでcreate_one()メソッドを呼び出し、作成するインデックスを指定するmongoxcc::search_index_modelインスタンスを渡します。
mongocxx::search_index_model コンストラクターには次の引数が必要です。
name:インデックスの名前を指定する stringdefinition:mappingsフィールドを含むドキュメント。これは、インデックスのフィールドを構成する方法を指定します
Tip
MongoDB Searchインデックスで構成できるフィールドの完全なリストについては、 MongoDB の検索ドキュメントの「 MongoDB 検索インデックス構文の検討」ガイドを参照してください。
次のセクションでは、静的マッピングまたは動的マッピングを使用する単一のMongoDB検索インデックスを作成する方法を示します。
静的マッピングを使用したMongoDB検索インデックスの作成
MongoDBの検索インデックスで静的マッピングを使用して、インデックスを作成するフィールドを指定し、個々のフィールドのインデックスオプションを構成します。
静的マッピングを使用する単一のMongoDB 検索インデックスを作成するには、まず mappingsフィールドを含む definitionドキュメントを作成します。mappingsフィールドで、次のフィールドと値を含むドキュメントを指定します。
dynamic:falseに設定します。fields:インデックスを作成するフィールドの名前とそのインデックス構成を指定するドキュメント。mappings.fieldsオプションの詳細については、 MongoDB Search ドキュメントの「 静的マッピングの例 」を参照してください。
次に、name string と definitionドキュメントをmongocxx::search_index_model コンストラクターに渡して、mongocxx::search_index_model をインスタンス化します。この mongocxx::search_index_modelインスタンスをcreate_one() メソッドに渡して、指定されたMongoDB 検索インデックスをコレクションに追加します。
次の例は、静的マッピングを使用する単一のMongoDB検索インデックスを作成する方法を示しています。
// Create an index model with your index name and definition containing the fields you want to index auto name = "myStaticIndex"; auto fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.standard"))), kvp("year", make_document(kvp("type","number")))); auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", fields)))); auto model = mongocxx::search_index_model(name, definition.view()); // Create the search index auto result = siv.create_one(model); std::cout << "New index name: " << result << std::endl;
New index name: myStaticIndex
重要
フィールド名の先頭にドル記号($)が含まれるフィールドにはインデックスを付けられません。
静的マッピングを使用するタイミングの詳細については、MongoDB 検索する ドキュメントの「静的マッピング」セクションを参照してください。
動的マッピングを使用したMongoDB検索インデックスの作成
MongoDB Search検索インデックスで 動的マッピング を使用して、サポートされているタイプのすべてのフィールドを自動的にインデックスします。サポートされているBSONデータ型のリストについては、 MongoDB Search ドキュメントのデータ型セクションを参照してください。
動的マッピングを使用する単一のMongoDB 検索インデックスを作成するには、まず mappingsフィールドを含む definitionドキュメントを作成します。mappingsフィールドで、値が true に設定されている dynamicフィールドを含むドキュメントを指定します。次に、name string と definitionドキュメントをmongocxx::search_index_model コンストラクターに渡して、mongocxx::search_index_model をインスタンス化します。この mongocxx::search_index_modelインスタンスをcreate_one() メソッドに渡して、指定されたMongoDB 検索インデックスをコレクションに追加します。
次の例は、動的マッピングを使用する単一のMongoDB検索インデックスを作成する方法を示しています。
// Create an index model with your index name and definition auto name = "myDynamicIndex"; auto definition = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model = mongocxx::search_index_model(name, definition.view()); // Create the search index auto result = siv.create_one(model); std::cout << "New index name: " << result << std::endl;
New index name: myDynamicIndex
動的マッピングをいつ使用するかについて詳しくは、 MongoDB Search ドキュメントの「動的マッピング」セクションを参照してください。
複数のMongoDB検索インデックスの作成
複数のMongoDB Search 検索インデックスを作成するには、mongocxx::search_index_viewインスタンスでcreate_many()メソッドを呼び出し、作成するMongoDB Search 検索インデックスを指定するmongocxx::search_index_modelインスタンスのベクトルを渡します。
次の例は、複数のMongoDB 検索インデックスを作成する方法を示しています。
// Create a vector to store Search index models std::vector<mongocxx::search_index_model> models; // Add an index model with dynamic mappings to the input vector auto name_1 = "myDynamicIndex"; auto definition_1 = make_document(kvp("mappings", make_document(kvp("dynamic", true)))); auto model_1 = mongocxx::search_index_model(name_1, definition_1.view()); models.push_back(model_1); // Add an index model with static mappings to the input vector auto name_2 = "myStaticIndex"; auto fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.standard"))), kvp("year", make_document(kvp("type","number")))); auto definition_2 = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", fields)))); auto model_2 = mongocxx::search_index_model(name_2, definition_2.view()); models.push_back(model_2); // Create the search indexes auto result = siv.create_many(models); // Print the search index names std::cout << "New index names:" << std::endl; for (const std::string& name : result) { std::cout << name << std::endl; }
New index names: myDynamicIndex myStaticIndex
MongoDB 検索インデックスの一覧表示
コレクションの検索インデックスを一覧表示するには、mongocxx::search_index_viewインスタンスでlist()メソッドを呼び出します。このメソッドでは、コレクションのMongoDB 検索インデックスを反復処理するために使用できる mongocxx::cursorインスタンスが返されます。
次の例では、複数のMongoDB Search インデックスの作成: のインデックスをポイントする cursor::iterator インスタンスを反復処理して、MongoDB Search インデックスのリストを出力します。
auto cursor = siv.list(); for (mongocxx::cursor::iterator it = cursor.begin(); it != cursor.end(); ++it) { std::cout << bsoncxx::to_json(*it) << std::endl; }
{ "id" : ..., "name" : "myDynamicIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : true } }, ...} { "id" : ..., "name" : "myStaticIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : false, "fields" : { "title" : { "type" : "string", "analyzer" : "lucene.standard" }, "year" : { "type" : "number" } } } }, ...}
あるいは、インデックス名を list() メソッドに渡すことで、特定のMongoDB 検索インデックスを一覧表示することもできます。これにより、指定されたインデックスのみを含む結果セットを指す mongocxx::cursorインスタンスが返されます。
次の例では、 list() メソッドを使用して、myDynamicIndex という名前のインデックスを出力します。
auto cursor = siv.list("myDynamicIndex"); for (mongocxx::cursor::iterator it = cursor.begin(); it != cursor.end(); ++it) { std::cout << bsoncxx::to_json(*it) << std::endl; }
{ "id" : ..., "name" : "myDynamicIndex", "type" : "search", ..., "latestDefinition" : { "mappings" : { "dynamic" : true } }, ...}
MongoDB 検索インデックスの更新
MongoDB 検索インデックスを更新するには、mongocxx::search_index_viewインスタンスで update_one() メソッドを呼び出し、更新するインデックスの名前と、インデックスを更新する定義を渡します。
次の例は、静的マッピングを使用した検索インデックスの作成からMongoDB検索インデックスを更新して、titleフィールドで単純なアナライザを使用する方法を示しています。
auto update_fields = make_document(kvp("title", make_document(kvp("type", "string"), kvp("analyzer","lucene.simple"))), kvp("year", make_document(kvp("type","number")))); auto update_definition = make_document(kvp("mappings", make_document(kvp("dynamic", false), kvp("fields", update_fields)))); siv.update_one("myStaticIndex", update_definition.view());
MongoDB Search インデックスの除去
MongoDB 検索インデックスをコレクションから除くには、mongocxx::search_index_viewインスタンスでdrop_one()メソッドを呼び出し、除くインデックスの名前を渡します。
次の例は、myDynamicIndex という名前のMongoDB 検索インデックスを削除する方法を示しています。
siv.drop_one("myDynamicIndex");
詳細情報
インデックスを管理する方法を示す実行可能な例については、「 インデックスを使用したクエリの最適化 」を参照してください。
MongoDB 検索機能の使用方法とMongoDB 検索検索インデックスの定義方法の詳細については、次のMongoDB 検索ガイドドキュメントページを参照してください。
API ドキュメント
このガイドで説明されているメソッドの詳細については、次のAPIドキュメントを参照してください。