Partager via


Créer des index de caractères génériques dans Azure Cosmos DB for MongoDB vCore

S’APPLIQUE À : MongoDB vCore

Les charges de travail qui ont un ensemble imprévisible de champs dans le schéma peuvent utiliser des index génériques pour prendre en charge les requêtes sur des champs arbitraires ou inconnus, pour des performances optimisées.

L’indexation par caractères génériques peut s’avérer utile dans les cas suivants :

  • Les requêtes filtrent sur les différents champs du document, ce qui rend l’indexation de tous les champs à l’aide d’une seule commande plus facile que l’indexation de chaque champ individuellement.
  • Les requêtes filtrent la plupart des champs du document, ce qui rend l’indexation de tous les champs, à l’exception de quelques-uns, par le biais d’une seule requête plus facile que l’indexation de la plupart des champs individuellement.

Indexation de tous les champs

Configurez un index générique pour faciliter les requêtes sur tous les champs de document possibles, y compris ceux avec des noms inconnus ou dynamiques.

db.collection.createIndex( { "$**": 1 } )

Important

Pour les collections volumineuses, nous vous recommandons d’utiliser une autre approche définie plus loin dans ce document.

Inclure ou exclure des champs spécifiques

Les index génériques peuvent également être limités à des champs spécifiques tout en excluant certains champs d’être ciblés pour l’indexation. Examinons un exemple pour le json suivant.

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "timeInOrgInYears": 7
}

Nous pouvons contrôler le comportement d’indexation, l’exemple limite la création d’index sur le champ firstName,lastName & timeInOrgInYears.

db.collection.createIndex( { "$**": 1 },
                           {"wildcardProjection" : {  "firstName": 0
                                                    , "lastName": 0
                                                    , "companyName": 1
                                                    , "division": 1
                                                    , "timeInOrgInYears": 0
                                                   }
                           }
                         )

Dans le document wildcardProjection, la valeur 0 ou 1 indique si le champ est inclus (1) ou exclu (0) de l’indexation.

Alternative pour l’indexation de tous les champs

Cet exemple décrit une solution simple pour minimiser l’effort nécessaire à la création d’index individuels jusqu’à ce que l’indexation par caractères génériques soit généralement disponible dans Azure Cosmos DB for MongoDB vCore.

Prenons l’exemple du document json ci-dessous :

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7,
    "roles": [
        {
            "teamName" : "Windows",
            "teamSubName" "Operating Systems",
            "timeInTeamInYears": 3
        },
        {
            "teamName" : "Devices",
            "teamSubName" "Surface",
            "timeInTeamInYears": 2
        },
        {
            "teamName" : "Devices",
            "teamSubName" "Surface",
            "timeInTeamInYears": 2
        }
    ]
}

Les index suivants sont créés en filigrane lorsque l’indexation par caractères génériques est utilisée.

  • db.collection.createIndex({"firstName", 1})
  • db.collection.createIndex({"lastName", 1})
  • db.collection.createIndex({"companyName", 1})
  • db.collection.createIndex({"division", 1})
  • db.collection.createIndex({"subDivision", 1})
  • db.collection.createIndex({"timeInOrgInYears", 1})
  • db.collection.createIndex({"subDivision", 1})
  • db.collection.createIndex({"roles.teamName", 1})
  • db.collection.createIndex({"roles.teamSubName", 1})
  • db.collection.createIndex({"roles.timeInTeamInYears", 1})

Bien que cet exemple de document ne nécessite qu’une combinaison de 10 champs pour être explicitement indexé, les documents plus importants comportant des centaines ou des milliers de champs peuvent s’avérer fastidieux et source d’erreurs lors de l’indexation individuelle des champs.

Le fichier jar décrit dans la suite de ce document simplifie l’indexation des champs dans les documents volumineux. Le fichier jar prend en entrée un exemple de document JSON, analyse le document et exécute les commandes createIndex pour chaque champ sans que l’utilisateur n’ait à intervenir.

Prérequis

Java 21

Une fois la machine virtuelle déployée, utilisez SSH pour vous y connecter et installez CQLSH en utilisant les commandes ci-dessous :

# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk

Exemple de fichier jar pour créer des index individuels pour tous les champs

Clonez le référentiel qui contient l’exemple Java pour parcourir chaque champ de la structure du document JSON et lancer des opérations de createIndex pour chaque champ du document.

git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git

Il n’est pas nécessaire de générer le référentiel cloné si aucune modification ne doit être apportée à la solution. Le fichier jar exécutable généré, nommé azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar, est déjà inclus dans le dossier runnableJar/. Le fichier jar peut être exécuté en spécifiant les paramètres requis suivants :

  • Chaîne de connexion du cluster Azure Cosmos DB for MongoDB vCore avec le nom d’utilisateur et le mot de passe utilisés lors de l’approvisionnement du cluster
  • La base de données vCore Azure Cosmos DB for MongoDB
  • La collection à indexer
  • L’emplacement du fichier json qui contient la structure du document pour la collection. Ce document est analysé par le fichier jar afin d’extraire chaque champ et d’effectuer des opérations createIndex individuelles.
java -jar azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar mongodb+srv://<user>:<password>@abinav-test-benchmarking.global.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000 cosmicworks employee sampleEmployee.json

Suivre l’état d’une opération createIndex

Le fichier jar est conçu pour ne pas attendre une réponse de chaque opération createIndex. Les index sont créés de manière asynchrone sur le serveur et la progression de l’opération de construction de l’index sur le cluster peut être suivie.

Prenez cet exemple en considération pour suivre la progression de l’indexation de la base de données « cosmicworks ».

use cosmicworks;
db.currentOp()

Lorsqu’une opération createIndex est en cours, la réponse ressemble à ceci :

{
  "inprog": [
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451493:1719209762286363",
      "op_prefix": 30000451493,
      "currentOpTime": "2024-06-24T06:16:02.000Z",
      "secs_running": 0,
      "command": { "aggregate": "" },
      "op": "command",
      "waitingForLock": false
    },
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451876:1719209638351743",
      "op_prefix": 30000451876,
      "currentOpTime": "2024-06-24T06:13:58.000Z",
      "secs_running": 124,
      "command": { "createIndexes": "" },
      "op": "workerCommand",
      "waitingForLock": false,
      "progress": {},
      "msg": ""
    }
  ],
  "ok": 1
}

Étapes suivantes