Overview
La funcionalidad de MongoDB Search permite realizar búsquedas de texto completas en colecciones alojadas en Atlas. Antes de poder realizar consultas de MongoDB Search, es necesario crear índices que especifiquen qué campos se van a indexar y cómo se indexan.
Para obtener más información sobre MongoDB Search, consulta el Visión general de MongoDB Search en la documentación de MongoDB Search.
Datos de muestra
Los ejemplos de esta guía utilizan el movies Colección en la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte la guía de introducción de MongoDB.
Para gestionar los índices de búsqueda de MongoDB Search en la colección sample_mflix desde tu aplicación en C++, primero instancia un mongocxx::client que se conecte a un clúster de Atlas y asigna los siguientes valores a tus variables db y collection:
auto db = client["sample_mflix"]; auto collection = db["movies"];
Luego, llama al método search_indexes() en tu variable collection para instanciar un mongocxx::search_index_view en tu colección:
auto siv = collection.search_indexes();
La clase mongocxx::search_index_view contiene las siguientes funciones miembro que le permiten interactuar con los índices de búsqueda de MongoDB:
create_one(): Crea un índice de Búsqueda de MongoDB con la configuración especificada
create_many(): crea múltiples índices de búsqueda de MongoDB con las configuraciones especificadas
list(): Devuelve una
mongocxx::cursorinstancia que apunta a una lista de índices de búsqueda de MongoDB en la colecciónupdate_one(): Actualiza la definición del índice de búsqueda de MongoDB especificado
drop_one(): remueve el índice especificado de la colección.
Nota
La gestión de índices de MongoDB Search es asíncrona.
El driver de C++ de MongoDB gestiona los índices MongoDB Search de forma asíncrona. Los métodos de la librería descritos en las siguientes secciones devuelven inmediatamente la respuesta del servidor, pero los cambios en sus índices de MongoDB Search se realizan en segundo plano y podrían no completarse hasta algún tiempo después.
Las siguientes secciones proporcionan ejemplos de código que demuestran cómo utilizar cada método de administración de índice de búsqueda de MongoDB.
Cree un índice de búsqueda de MongoDB
Para crear un único índice de MongoDB Search en una colección, llama al método create_one() en una instancia mongocxx::search_index_view y pasa una instancia mongoxcc::search_index_model especificando el índice que deseas crear.
El constructor mongocxx::search_index_model requiere los siguientes argumentos:
name: String que especifica el nombre del índicedefinition:Documento que contiene el campomappings, que especifica cómo configurar los campos en su índice
Tip
Para obtener una lista completa de los campos que puede configurar en un índice de búsqueda de MongoDB, consulte la guía Revisar la sintaxis del índice de búsqueda de MongoDB en la documentación de Búsqueda de MongoDB.
Las siguientes secciones muestran cómo crear un único índice de MongoDB Search que utiliza asignaciones estáticas o dinámicas.
Crear un índice de búsqueda de MongoDB con asignaciones estáticas
Utilice asignaciones estáticas en su índice de búsqueda de MongoDB para especificar los campos que desea indexar y configurar opciones de índice para campos individuales.
Para crear un único índice de búsqueda de MongoDB que utilice asignaciones estáticas, primero crea un documento definition que contenga el campo mappings. En el campo mappings, especifica un documento que contenga los siguientes campos y valores:
dynamic:Establecer enfalse.fields: Documento que especifica los nombres de los campos que desea indexar y sus configuraciones de índice. Para obtener más información sobre las opciones demappings.fields, consulte el Ejemplo de mapeo estático en la documentación de MongoDB Search.
Luego, pasa una string name y el documento definition a un constructor mongocxx::search_index_model para crear una instancia de un mongocxx::search_index_model. Pase esta instancia mongocxx::search_index_model al método create_one() para añadir el índice de MongoDB Search especificado a su colección.
El siguiente ejemplo muestra cómo crear un único índice de búsqueda de MongoDB que usa asignaciones estáticas:
// 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
Importante
No puedes indexar campos que contengan el signo de dólar ($) al inicio del nombre del campo.
Para obtener más información sobre cuándo utilizar asignaciones estáticas, consulte la sección Asignaciones estáticas en la documentación de Búsqueda de MongoDB.
Crear un índice de búsqueda de MongoDB con asignaciones dinámicas
Utilice mapeos dinámicos en su índice de búsqueda de MongoDB para indexar automáticamente todos los campos de los tipos compatibles. Para obtener una lista de los tipos de datos BSON compatibles, consulte la sección Tipos de datos en la documentación de MongoDB Search.
Para crear un único índice de búsqueda de MongoDB que utilice asignaciones dinámicas, primero cree un documento definition que contenga el campo mappings. En el campo mappings, especifique un documento que contenga el campo dynamic con su valor true. A continuación, pase una cadena name y el documento definition a un constructor mongocxx::search_index_model para instanciar un mongocxx::search_index_model. Pase esta instancia mongocxx::search_index_model al método create_one() para añadir el índice de búsqueda de MongoDB especificado a su colección.
El siguiente ejemplo muestra cómo crear un único índice de búsqueda de MongoDB que utilice asignaciones dinámicas:
// 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
Para obtener más información sobre cuándo utilizar asignaciones dinámicas, consulte la sección Asignaciones dinámicas en la documentación de Búsqueda de MongoDB.
Crear múltiples índices de búsqueda de MongoDB
Para crear múltiples índices de búsqueda de MongoDB, llame al método create_many() en una instancia mongocxx::search_index_view y pase un vector de mongocxx::search_index_model instancias que especifiquen los índices de búsqueda de MongoDB que desea crear.
El siguiente ejemplo muestra cómo crear múltiples índices de búsqueda de 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
Listar índices de MongoDB Search
Para enumerar los índices de MongoDB Search en una colección, llama al método list() en una instancia de mongocxx::search_index_view. Este método devuelve una instancia mongocxx::cursor que se puede utilizar para iterar sobre los índices de MongoDB Search de la colección.
El siguiente ejemplo imprime una lista de índices de búsqueda de MongoDB iterando sobre una instancia de cursor::iterator que apunta a los índices desde Crear múltiples índices de búsqueda de MongoDB:
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" } } } }, ...}
Como alternativa, puedes enumerar un índice de búsqueda específico de MongoDB pasando un nombre de índice en el método list(). Esto devuelve una instancia de mongocxx::cursor que apunta a un conjunto de resultados que solo contiene el índice especificado.
El siguiente ejemplo utiliza el método list() para imprimir un índice con el nombre 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 } }, ...}
Actualizar un MongoDB Search índice
Para actualizar un índice de búsqueda de MongoDB, se debe llamar al método update_one() en una instancia de mongocxx::search_index_view y pasar el nombre del índice que se quiera actualizar y la definición para actualizar ese índice.
El siguiente ejemplo muestra cómo actualizar el índice de MongoDB Search desde Crear un índice de búsqueda con mapeos estáticos para usar un analizador simple en el campo 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());
Eliminar un índice de búsqueda de MongoDB
Para remover un índice de búsqueda de MongoDB de una colección, llama al método drop_one() en una instancia mongocxx::search_index_view y pasa el nombre del índice que deseas remover.
El siguiente ejemplo muestra cómo remover un índice de búsqueda de MongoDB llamado myDynamicIndex:
siv.drop_one("myDynamicIndex");
Información Adicional
Para obtener una aplicación de ejemplo que demuestra cómo administrar índices en el controlador C++, consulte la guía Índices <cpp-indexes>.
Para obtener guías más detalladas sobre cómo usar la funcionalidad de búsqueda de MongoDB y definir los índices de búsqueda de MongoDB, consulta las siguientes páginas de documentación de búsqueda de MongoDB:
Documentación de la API
Para obtener más información sobre los métodos analizados en esta guía, consulte la siguiente documentación de API: