Administración de la indexación en el núcleo virtual de Azure Cosmos DB for MongoDB
SE APLICA A: núcleo virtual de MongoDB
Los índices son estructuras que mejoran la velocidad de recuperación de datos al proporcionar acceso rápido a los campos de una colección. Funcionan creando un conjunto ordenado de punteros a datos, a menudo basados en campos clave. El núcleo virtual de Azure Cosmos DB for MongoDB usa índices en varios contextos, como la inserción de consultas, las restricciones únicas y el particionamiento.
Importante
El campo "_id" es el único campo indexado de forma predeterminada y el tamaño máximo del campo puede ser 2 KB
. Se recomienda agregar índices adicionales basados en filtros de consulta y predicados para optimizar el rendimiento.
Tipos de índice
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. Todo el ejemplo entrecomillado utiliza aún más la estructura de esta colección.
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure Cosmos DB - A Game Changer",
"content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
"author": {lastName: "Doe", firstName: "John"},
"category": "Technology",
"launchDate": ISODate("2024-06-24T10:08:20.000Z"),
"published": true
}
Índices de campo único
Los índices de campo único almacenan información de un único campo de una colección. No importa el criterio de ordenación del índice de campo único. _id
el campo permanece indexado de forma predeterminada.
El núcleo virtual de Azure Cosmos DB for MongoDB admite la creación de índices a continuación
- Campos de documento de nivel superior.
- Documento incrustado.
- Campos dentro del documento incrustado.
El comando siguiente crea un índice de campo único en el campo author
y el siguiente comando lo crea en un campo firstName
incrustado.
use cosmicworks
db.products.createIndex({"author": 1})
// indexing embedded property
db.products.createIndex({"author.firstName": -1})
Una consulta puede usar varios índices de campo único cuando estén disponibles.
Nota:
El núcleo virtual de Azure Cosmos DB for MongoDB permite crear un máximo de 64 índices en una colección. En función del nivel, podemos planear la extensión hasta 300 índices a petición.
Índices compuestos
Los índices compuestos mejoran el rendimiento de la base de datos al permitir consultas y ordenación eficaces en función de varios campos dentro de los documentos. Esta optimización reduce la necesidad de examinar colecciones completas, lo que acelera la recuperación de datos y la organización.
El comando siguiente crea un índice compuesto en los campos author
y launchDate
en criterio de ordenación inverso.
use cosmicworks
db.products.createIndex({"author":1, "launchDate":-1})
Order
de los campos afectan a la selectividad o al uso del índice. La consultafind
no usaría el índice creado.
use cosmicworks
db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})
Limitaciones
- Máximo de 32 campos\rutas de acceso dentro de un índice compuesto.
Índices parciales
Índices que tienen un filtro de consulta asociado que describe cuándo generar un término en el índice.
use cosmicworks
db.products.createIndex (
{ "author": 1, "launchDate": 1 },
{ partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)
Limitaciones
- Los índices parciales no admiten
ORDER BY
niUNIQUE
a menos que el filtro califique.
Índices de texto
Los índices de texto son estructuras de datos especiales que optimizan las consultas basadas en texto, lo que las hace más rápidas y eficaces.
Use el método createIndex
con la opción text
para crear un índice de texto en el campo title
.
use cosmicworks;
db.products.createIndex({ title: "text" })
Nota:
Aunque solo puede definir un índice de texto por colección, el núcleo virtual de Azure Cosmos DB for MongoDB le permite crear índices de texto en combinación de varios campos para permitirle realizar búsquedas de texto en distintos campos de los documentos.
Configurar opciones de índice de texto
Los índices de texto del núcleo virtual 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:
Crear un índice para admitir la búsqueda en el
title
ycontent
los campos con soporte en inglés. Además, se ha asignado mayor peso al campotitle
para darle prioridad en los resultados de búsqueda.use cosmicworks db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
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.
Realice una búsqueda de texto para la frase
Cosmos DB
.use cosmicworks db.products.find( { $text: { $search: "Cosmos DB" } } )
Opcionalmente, use el operador de proyección
$meta
junto con el campotextScore
en una consulta para ver el pesouse cosmicworks db.products.find( { $text: { $search: "Cosmos DB" } }, { score: { $meta: "textScore" } } )
Limitaciones
- Solo se puede definir un índice de texto en una colección.
- Los índices de texto admiten búsquedas de texto simples y aún no proporcionan funcionalidades de búsqueda avanzadas como expresiones regulares.
- Las operaciones de ordenación no pueden usar el orden del índice de texto en MongoDB.
- Hint() no es compatible con una consulta que utilice la expresión $text.
- Los índices de texto pueden ser relativamente grandes y consumir un espacio de almacenamiento significativo en comparación con otros tipos de índice.
Índices carácter comodín
Índice en un solo campo, indexa todas las rutas de acceso debajo de field
, excepto otros campos que están en el mismo nivel. Por ejemplo, para el siguiente documento de ejemplo
{
"children":
{
"familyName": "Merriam",
"pets": { "details": {“name”: "Goofy", ”age”: 3} }
}
}
Crear un índice en { "pets.$**": 1 }, crea un índice sobre las propiedades de detalles y subdocumentos, pero no crea un índice en "familyName".
Limitaciones
- Los índices se carácter comodín no admiten índices únicos.
- Los índices comodín no admiten inserciones de
ORDER BY
a menos que el filtro incluya solo rutas de acceso presentes en el carácter comodín (ya que no indexan elementos sin definir) - Un índice de caracteres comodín compuesto solo puede tener
one
término comodín yone
o más términos de índice adicionales.{ "pets.$**": 1, “familyName”: 1 }
Índices geoespaciales
Los índices geoespaciales admiten consultas en los datos almacenados como objetos GeoJSON o pares de coordenadas heredados. Puede usar índices geoespaciales para mejorar el rendimiento de las consultas en datos geoespaciales o para ejecutar determinadas consultas geoespaciales.
El núcleo virtual de Azure Cosmos DB for MongoDB proporciona dos tipos de índices geoespaciales:
- Índices 2dsphere, que admiten consultas que interpretan la geometría en una esfera.
- Índices 2d, que admiten consultas que interpretan la geometría en una superficie plana.
Índices 2d
Los índices 2d solo se admiten con el estilo heredado del par de coordenadas de almacenamiento de datos geoespaciales.
Use el método createIndex
con la opción 2d
para crear un índice geoespacial en el campo location
.
db.places.createIndex({ "location": "2d"});
Limitaciones
- Solo
one
campo de ubicación puede formar parte del índice2d
y soloone
campo no geoespacial puede formar parte del índice decompound 2d
db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })
Índices 2dsphere
Los índices 2dsphere
admiten consultas geoespaciales en una esfera similar a la Tierra. Puede admitir objetos GeoJSON o pares de coordenadas heredados. Los índices 2dSphere
funcionan con el estilo GeoJSON de almacenar datos, si se encuentran puntos heredados, estos pueden convertirse en punto GeoJSON.
Use el método createIndex
con la opción 2dsphere
para crear un índice geoespacial en el campo location
.
db.places.createIndex({ "location": "2dsphere"});
Los índices 2dsphere
permiten crear índices en varios campos de datos geoespaciales y varios no geoespaciales.
db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })
Limitaciones
No se admite un índice compuesto mediante un índice normal y un índice geoespacial. La creación de cualquiera de los índices geoespaciales provocaría errores.
// Compound Regular & 2dsphere indexes are not supported yet db.collection.createIndex({a: 1, b: "2dsphere"}) // Compound 2d indexes are not supported yet db.collection.createIndex({a: "2d", b: 1})
Los polígonos con agujeros no funcionan. La inserción de un polígono con agujero no está restringida, aunque se produce un error en la consulta
$geoWithin
para escenarios:Si la propia consulta tiene polígono con agujeros
coll.find( { "b": { "$geoWithin": { "$geometry": { "coordinates": [ [ [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0] ], [ [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5] ] ], "type": "Polygon" } } } }) // MongoServerError: $geoWithin currently doesn't support polygons with holes
Si hay algún documento sin filtrar que tenga polígono con agujeros.
[mongos] test> coll.find() [ { _id: ObjectId("667bf7560b4f1a5a5d71effa"), b: { type: 'Polygon', coordinates: [ [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ], [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ] ] } } ] // MongoServerError: $geoWithin currently doesn't support polygons with holes
El campo
key
es obligatorio mientras se usageoNear
.[mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }]) // MongoServerError: $geoNear requires a 'key' option as a String
Pasos siguientes
- Obtenga información sobre Procedimientos recomendados de indexación para obtener resultados más eficaces.
- Más información sobre indexación en segundo plano
- Obtenga información para trabajar con indexación de texto aquí.
- Obtenga información sobre la indexación de caracteres comodín aquí.