Compartir a través de


Búsqueda y consulta con índices de texto en Azure Cosmos DB for MongoDB de núcleo virtual

SE APLICA A: núcleo virtual de MongoDB

Una de las características clave que proporciona Azure Cosmos DB para el núcleo virtual de MongoDB es la indexación de texto, que permite realizar búsquedas y consultas eficaces de datos basados en texto. El servicio implementa índices de texto de la versión 2. La versión 2 admite la distinción entre mayúsculas y minúsculas, pero no la sensibilidad diacrítica.

Los índices de texto de Azure Cosmos DB for MongoDB son estructuras de datos especiales que optimizan las consultas basadas en texto, lo que las hace más rápidas y eficaces. Están diseñadas para manejar contenido textual como documentos, artículos, comentarios o cualquier otro tipo de datos con mucho texto. Los índices de texto usan técnicas como la tokenización, la lematización y las palabras irrelevantes para crear un índice que mejore el rendimiento de las búsquedas basadas en texto.

Requisitos previos

Definición de un índice de texto

Para simplificar, consideremos el ejemplo de una aplicación de blog con la siguiente configuración:

  • Nombre de base de datos: cosmicworks
  • Nombre de la colección: products

En esta aplicación de ejemplo se almacenan artículos como documentos con la estructura siguiente:

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": "John Doe",
  "category": "Technology",
  "published": true
}
  1. Use el métodocreateIndex con la opcióntext para crear un índice de texto en el campotitle.

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    Nota:

    Aunque solo se pueda definir un índice de texto por colección, Azure Cosmos DB for MongoDB núcleo virtual permite crear índices de texto en varios campos para poder realizar búsquedas de texto en diferentes campos de los documentos.

  2. Opcionalmente, cree un índice para permitir la búsqueda en los campos title y content.

    db.products.createIndex({ title: "text", content: "text" })
    

Configurar opciones de índice de texto

Los índices de texto de Azure Cosmos DB for MongoDB incluyen varias opciones para personalizar su comportamiento. Por ejemplo, puede especificar el idioma para el análisis de texto, establecer ponderaciones para priorizar determinados campos y configurar búsquedas que no distinguen mayúsculas de minúsculas. Este es un ejemplo de creación de un índice de texto con opciones:

  1. Crear un índice para admitir la búsqueda en el title y content los campos con soporte en inglés. Además, se ha asignado mayor peso al campo title para darle prioridad en los resultados de búsqueda.

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Pesos en índices de texto

Al crear un índice de texto, puede asignar distintos pesos a los distintos campos del índice. Estas ponderaciones representan la importancia o relevancia de cada campo de la búsqueda. El núcleo virtual de Azure Cosmos DB for MongoDB calcula una puntuación y ponderaciones asignadas para cada documento en función de los términos de búsqueda al ejecutar una consulta de búsqueda de texto. La puntuación representa la relevancia del documento en la consulta de búsqueda.

  1. Cree un índice para admitir la búsqueda en los campos titleycontent. Asigna un peso de 2 al campo "título" y un peso de 1 al campo "contenido".

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    Nota:

    Cuando un cliente realiza una consulta de búsqueda de texto con el término "Cosmos DB", la puntuación de cada documento de la colección se calculará en función de la presencia y frecuencia del término en los campos "título" y "contenido", con mayor importancia del campo "título" debido a su mayor peso.

Realizar una búsqueda de texto mediante un índice de texto

Una vez creado el índice de texto, puede realizar búsquedas de texto mediante el operador "text" en las consultas. El operador de texto toma una cadena de búsqueda y la compara con el índice de texto para buscar los documentos pertinentes.

  1. Realice una búsqueda de texto para la frase Cosmos DB.

    db.products.find(
        { $text: { $search: "Cosmos DB" } }
    )
    
  2. Opcionalmente, use el operador de proyección $meta junto con el campo textScore en una consulta para ver el peso

    db.products.find(
        { $text: { $search: "Cosmos DB" } },
        { score: { $meta: "textScore" } }
    )
    

Anular un índice de texto

Para eliminar un índice de texto en MongoDB, puede usar el métododropIndex() en la colección y especificar la clave del índice o el nombre del índice de texto que desea eliminar.

  1. Quite un índice de texto especificando explícitamente la clave.

    db.products.dropIndex({ title: "text" })
    
  2. Opcionalmente, quite un índice de texto especificando el nombre único generado automáticamente.

    db.products.dropIndex("title_text")
    

Limitaciones del índice de texto

  • Solo se puede definir un índice de texto en una colección.
  • Los índices de texto admiten búsquedas de texto sencillas y no ofrecen funciones de búsqueda avanzadas, como las búsquedas mediante expresiones regulares.
  • Hint() no es compatible con una consulta que utilice la expresión $text.
  • Las operaciones de ordenación no pueden usar el orden del índice de texto en MongoDB.
  • Los índices de texto pueden ser relativamente grandes y consumir un espacio de almacenamiento significativo en comparación con otros tipos de índice.

Paso siguiente