Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les index sont des structures qui améliorent la vitesse de récupération des données en fournissant 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 DocumentDB utilise des index dans plusieurs contextes, notamment le « push down » (transfert) de requêtes, les contraintes uniques et le partitionnement.
Important
Le champ « _id » est le seul champ indexé par défaut et la taille maximale du champ peut être 2 KB. Il est recommandé d’ajouter des index supplémentaires en fonction des filtres de requête et des prédicats pour optimiser les performances.
Types d’index
Par souci de simplicité, prenons un exemple d’application de blog avec la configuration 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. Tout l’exemple cité utilise davantage la structure de cette collection.
{
"_id": ObjectId("617a34e7a867530bff1b2346"),
"title": "Azure DocumentDB - A Game Changer",
"content": "Azure DocumentDB 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 de champ uniques stockent des informations à partir d’un seul champ d’une collection. L’ordre de tri d’un index à champ unique n’a pas d’importance.
_id le champ reste indexé par défaut.
Azure DocumentDB prend en charge la création d’index à l’adresse suivante
- Champs de document de niveau supérieur.
- Document incorporé.
- Champs dans le document incorporé.
La commande suivante crée un index de champ unique sur le champ author et la commande suivante la crée sur un champ firstNameincorporé.
use cosmicworks
db.products.createIndex({"author": 1})
// indexing embedded property
db.products.createIndex({"author.firstName": -1})
Une requête peut utiliser plusieurs index de champ unique, le cas échéant.
Note
Azure DocumentDB permet de créer au maximum 64 index sur une collection. Selon le niveau, nous pouvons planifier l’extension jusqu’à 300 index à la demande.
Index composés
Les index composés améliorent les performances de la base de données en autorisant l’interrogation et le tri efficaces en fonction de plusieurs champs dans des documents. Cette optimisation réduit la nécessité d’analyser l’ensemble des regroupements, d’accélérer la récupération 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 opposé.
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 find requête 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 BYouUNIQUEsauf si le filtre est éligible.
Indices de texte
Les index de texte sont des structures de données spéciales qui optimisent les requêtes basées sur du texte, ce qui les rend plus rapides et plus efficaces.
Utilisez la createIndex méthode avec l’option text permettant de créer un index de texte sur le title champ.
use cosmicworks;
db.products.createIndex({ title: "text" })
Note
Bien que vous ne puissiez définir qu’un seul index de texte par collection, Azure DocumentDB vous permet de créer des index de texte sur la combinaison de plusieurs champs pour vous permettre d’effectuer des recherches de texte sur différents champs de vos documents.
Configurer les options d’index de texte
Les index de texte dans Azure DocumentDB 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
titleetcontentavec la prise en charge de la langue anglaise. Attribuez également des pondérations plus élevées autitlechamp pour la hiérarchiser 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 } )
Note
Lorsqu’un client effectue une requête de recherche de texte avec le terme « DocumentDB », 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 « title » et « content », avec une importance plus élevée donnée au champ « title » en raison de son poids supérieur.
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 « text » 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 des documents pertinents.
Effectuez une recherche de texte pour l’expression
DocumentDB.use cosmicworks db.products.find( { $text: { $search: "DocumentDB" } } )Si vous le souhaitez, utilisez l'opérateur de projection
$metaavec le champtextScoredans une requête pour afficher le poids.use cosmicworks db.products.find( { $text: { $search: "DocumentDB" } }, { score: { $meta: "textScore" } } )
Limites
- Un seul index de texte peut être défini sur une collection.
- Les opérations de tri ne peuvent pas utiliser l’ordre de l’index de texte dans MongoDB.
- Hint() n’est pas pris en charge en combinaison avec une requête à l’aide de $text expression.
- Les index de texte peuvent être relativement volumineux, consommant un espace de stockage important par rapport à d’autres types d’index.
Index génériques
Index d'un seul champ, indexe tous les chemins sous le field, à l’exclusion des 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-documents, 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 avec joker composé ne peut avoir qu'un terme joker
oneetoneou plus de termes d’index.{ "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 DocumentDB fournit deux types d’index géospatiaux :
- Indexes 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 plate.
Index 2d
Les index 2D sont pris en charge uniquement avec le style de paire de coordonnées hérité pour le stockage des données géospatiales.
Utilisez la createIndex méthode avec l’option 2d permettant de créer un index géospatial sur le location champ.
db.places.createIndex({ "location": "2d"});
Limites
- Seul
onele champ d’emplacement peut faire partie de l’index2det seuloneun autre champ non géospatial peut faire partie de l’indexcompound 2d.db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })
Index 2dsphere
2dsphere les index prennent en charge les requêtes géospatiales sur une sphère semblable à la terre. Il peut 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 sont convertis en point GeoJSON.
Utilisez la createIndex méthode avec l’option 2dsphere permettant de créer un index géospatial sur le location champ.
db.places.createIndex({ "location": "2dsphere"});
2dsphere les index 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
Un index composé 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 un trou n'est pas restreinte bien que
$geoWithinla requête échoue dans 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 holesS’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 holeskeyLe champ 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
- Découvrez les meilleures pratiques d’indexation pour les résultats les plus efficaces.
- En savoir plus sur l’indexation en arrière-plan
- Apprenez ici à utiliser l’indexation de texte.
- Découvrez ici l’indexation par caractères génériques.