Gérer l’indexation dans Azure Cosmos DB for MongoDB vCore
S’APPLIQUE À : MongoDB vCore
Les index sont des structures qui améliorent la vitesse d’extraction des données en offrant un accès rapide aux champs d’une collection. Ils fonctionnent en créant un ensemble ordonné de pointeurs vers des données, souvent basés sur des champs clés. Azure Cosmos DB for MongoDB vCore utilise des index dans plusieurs contextes, notamment le « push down » de requêtes, les contraintes uniques et le partitionnement.
Important
Le champ « _id » est le seul champ indexé par défaut et sa taille maximale peut atteindre 2 KB
. Il est recommandé d’ajouter des index supplémentaires en fonction des filtres et des prédicats de requête pour optimiser les performances.
Types d’index
Par souci de simplicité, prenons l’exemple d’une application de blog qui stocke des articles avec la structure de document suivante :
- Nom de la base de données :
cosmicworks
- Nom de la collection :
products
Cet exemple d’application stocke des articles sous forme de documents avec la structure suivante. L’intégralité de l’exemple cité plus loin utilise la structure de cette collection.
{
"_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
}
Index de champ unique
Les index à champ unique stockent les informations d’un seul champ d’une collection. L’ordre de tri d’un index à champ unique n’a pas d’importance. Le champ _id
reste indexé par défaut.
Azure Cosmos DB for MongoDB vCore prend en charge la création d’index sur les éléments suivants
- Champs de documents de niveau supérieur.
- Document incorporé.
- Champs dans le document incorporé.
La commande suivante crée un index à champ unique sur le champ author
et la commande suivante le crée sur un champ incorporé firstName
.
use cosmicworks
db.products.createIndex({"author": 1})
// indexing embedded property
db.products.createIndex({"author.firstName": -1})
Une requête peut utiliser plusieurs index à champ unique, le cas échéant.
Remarque
Azure Cosmos DB for MongoDB vCore permet de créer un maximum de 64 index sur une collection. Selon le niveau, nous pouvons planifier une extension jusqu’à 300 index à la demande.
Index composés
Les index composés améliorent les performances de la base de données en permettant d’interroger et de trier efficacement en fonction de plusieurs champs dans les documents. Cette optimisation réduit le besoin d’analyser l’ensemble des collections, ce qui permet d’accélérer l’extraction et l’organisation des données.
La commande suivante crée un index composé sur les champs author
et launchDate
dans l’ordre de tri inverse.
use cosmicworks
db.products.createIndex({"author":1, "launchDate":-1})
Le tri (Order
) des champs affecte la sélectivité ou l’utilisation de l’index. La requête find
n’utilise pas l’index créé.
use cosmicworks
db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})
Limites
- Maximum de 32 champs\chemins dans un index composé.
Index partiels
Index qui ont un filtre de requête associé qui décrit quand générer un terme dans l’index.
use cosmicworks
db.products.createIndex (
{ "author": 1, "launchDate": 1 },
{ partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)
Limites
- Les index partiels ne prennent pas en charge
ORDER BY
ouUNIQUE
, sauf si le filtre est éligible.
Index de texte
Les index de texte sont des structures de données spéciales qui optimisent les requêtes de texte, ce qui les rend plus rapides et plus efficaces.
Utiliser la createIndex
méthode avec l’text
option pour la création d’un index de texte sur le title
champ.
use cosmicworks;
db.products.createIndex({ title: "text" })
Remarque
Même si vous ne pouvez définir qu’un seul index de texte par collection, Azure Cosmos DB for MongoDB vCore vous permet de créer des index de texte sur une combinaison de plusieurs champs pour vous permettre d’effectuer des recherches de texte dans différents champs de vos documents.
Configurer les options d’index de texte
Les index de texte dans Azure Cosmos DB for MongoDB vCore sont fournis avec plusieurs options pour personnaliser leur comportement. Par exemple, vous pouvez spécifier la langue pour l’analyse de texte, définir des pondérations pour hiérarchiser certains champs et configurer des recherches qui ne respectent pas la casse. Voici un exemple de création d’un index de texte avec des options :
Créez un index pour prendre en charge la recherche sur les champs
title
etcontent
avec prise en charge de la langue anglaise. Nous avons également attribué des pondérations plus élevées au champtitle
pour le prioriser dans les résultats de recherche.use cosmicworks db.products.createIndex( { title: "text", content: "text" }, { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false } )
Remarque
Lorsqu’un client effectue une requête de recherche de texte avec le terme « Cosmos DB », le score de chaque document de la collection est calculé en fonction de la présence et de la fréquence du terme dans les champs « titre » et « contenu », avec une plus grande importance accordée au champ « titre » en raison de sa pondération plus élevée.
Effectuer une recherche de texte à l’aide d’un index de texte
Une fois l’index de texte créé, vous pouvez effectuer des recherches de texte à l’aide de l’opérateur « texte » dans vos requêtes. L’opérateur de texte prend une chaîne de recherche et la met en correspondance avec l’index de texte pour rechercher les documents pertinents.
Effectuer une recherche de texte pour l’expression
Cosmos DB
.use cosmicworks db.products.find( { $text: { $search: "Cosmos DB" } } )
Si vous le souhaitez, utilisez l’opérateur de projection
$meta
avec le champtextScore
dans une requête pour voir la pondérationuse cosmicworks db.products.find( { $text: { $search: "Cosmos DB" } }, { score: { $meta: "textScore" } } )
Limites
- Un seul index de texte peut être défini sur une collection.
- Les index de texte prennent en charge les recherches de texte simples et ne fournissent pas encore de fonctionnalités de recherche avancées, comme les expressions régulières.
- Les opérations de tri ne peuvent utiliser le classement de l’index de texte dans MongoDB.
- Hint() n’est pas pris en charge en association avec une requête utilisant une expression $text.
- Les index de texte peuvent être relativement volumineux et consommer un espace de stockage important par rapport à d’autres types d’index.
Index génériques
Index sur un seul champ, indexe tous les chemins sous le field
, en excluant les autres champs situés au même niveau. Par exemple, pour l’exemple de document suivant
{
"children":
{
"familyName": "Merriam",
"pets": { "details": {“name”: "Goofy", ”age”: 3} }
}
}
Création d’un index sur { "pets.$**": 1 }, crée un index sur les propriétés de détails et de sous-document, mais ne crée pas d’index sur « familyName ».
Limites
- Les index génériques ne peuvent pas prendre en charge les index uniques.
- Les index génériques ne prennent pas en charge les « push downs » de
ORDER BY
, sauf si le filtre inclut uniquement les chemins présents dans le caractère générique (puisqu’ils n’indexent pas les éléments non définis) - Un index générique composé peut avoir seulement un
one
terme générique etone
ou plusieurs termes d’index supplémentaires.{ "pets.$**": 1, “familyName”: 1 }
Index géospatiaux
Les index géospatiaux prennent en charge les requêtes sur les données stockées sous forme d’objets GeoJSON ou de paires de coordonnées héritées. Vous pouvez utiliser des index géospatiaux pour améliorer les performances des requêtes sur des données géospatiales ou pour exécuter certaines requêtes géospatiales.
Azure Cosmos DB for MongoDB vCore fournit deux types d’index géospatiaux :
- Index 2dsphere, qui prennent en charge les requêtes qui interprètent la géométrie sur une sphère.
- Index 2d, qui prennent en charge les requêtes qui interprètent la géométrie sur une surface plane.
Index 2d
Les index 2d sont pris en charge uniquement avec le style de stockage de données géospatiales qui se présente sous la forme de paires de coordonnées héritées.
Utilisez la createIndex
méthode avec l’2d
option pour la création d’un index géospatial sur le location
champ.
db.places.createIndex({ "location": "2d"});
Limites
- Seul
one
champ de localisation peut faire partie de l’2d
index et seulone
autre champ non géospatial peut faire partie de l’compound 2d
indexdb.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })
Index 2dsphere
Les index 2dsphere
prennent en charge les requêtes géospatiales sur une sphère terrestre. Ils peuvent prendre en charge les objets GeoJSON ou les paires de coordonnées héritées. 2dSphere
les index fonctionnent avec le style GeoJSON de stockage des données, si des points hérités sont rencontrés, ils seront convertis en points GeoJSON.
Utilisez la createIndex
méthode avec l’2dsphere
option pour la création d’un index géospatial sur le location
champ.
db.places.createIndex({ "location": "2dsphere"});
Les index 2dsphere
permettent de créer des index sur plusieurs champs de données géospatiales et non géospatiales.
db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })
Limites
Les index composés utilisant un index normal et un index géospatial ne sont pas pris en charge. La création de l’un des index géospatiaux entraîne des erreurs.
// 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})
Les polygones avec des trous ne fonctionnent pas. L’insertion d’un polygone avec des trous n’est pas limitée, mais la requête
$geoWithin
échoue pour les scénarios suivants :Si la requête elle-même a un polygone avec des trous
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
S’il existe un document non filtré qui a un polygone avec des trous.
[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
Le champ
key
est obligatoire lors de l’utilisation degeoNear
.[mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }]) // MongoServerError: $geoNear requires a 'key' option as a String
Étapes suivantes
- Apprenez-en davantage les meilleures pratiques en matière d’indexation afin d’obtenir des résultats plus efficaces.
- En savoir plus sur l’indexation en arrière-plan
- Découvrez comment utiliser l’indexation de texte.
- En savoir plus sur l’indexation avec caractères génériques.