Condividi tramite


Creare indici con caratteri jolly in Azure DocumentDB

Carichi di lavoro con campi imprevedibili nello schema possono utilizzare indici wildcard per supportare query su campi arbitrari o sconosciuti, ottimizzando così le prestazioni.

L'indicizzazione con wildcard può essere utile negli scenari seguenti:

  • Le query che filtrano in base a qualsiasi campo del documento semplificano l'indicizzazione di tutti i campi tramite un singolo comando rispetto all'indicizzazione di ogni campo singolarmente.
  • Le interrogazioni che filtrano la maggior parte dei campi nel documento semplificano l'indicizzazione di quasi tutti i campi attraverso un unico processo, rendendolo più facile rispetto all'indicizzazione della maggior parte dei campi singolarmente.

Indicizzazione di tutti i campi

Configurare un indice wildcard per facilitare le query su tutti i possibili campi del documento, inclusi quelli con nomi sconosciuti o dinamici.

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

Importante

Per le raccolte di grandi dimensioni, è consigliabile usare un approccio alternativo definito più avanti in questo documento.

Includere o escludere campi specifici

Gli indici con caratteri jolly possono anche essere limitati a campi specifici in modo da escludere alcuni campi come destinazioni per l'indicizzazione. Esaminiamo un esempio per il codice Json seguente.

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

È possibile controllare il comportamento di indicizzazione, l'esempio limita la creazione di indici in firstName,lastName & timeInOrgInYears field.

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

Nel documento wildcardProjection il valore 0 o 1 indica se il campo è incluso (1) o escluso (0) dall'indicizzazione.

Alternativa all'indicizzazione di tutti i campi

Questo esempio descrive una soluzione alternativa semplice per ridurre al minimo lo sforzo necessario per creare singoli indici fino a quando l'indicizzazione con wildcard sarà generalmente disponibile in Azure DocumentDB.

Si consideri il documento JSON seguente:

{
    "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
        }
    ]
}

Gli indici seguenti vengono creati quando si utilizza l'indicizzazione con caratteri jolly.

  • 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})

Anche se questo documento di esempio richiede solo una combinazione di 10 campi per essere indicizzati in modo esplicito, i documenti più grandi con centinaia o migliaia di campi possono diventare noiosi e soggetti a errori durante l'indicizzazione dei campi singolarmente.

Il file JAR descritto nel resto di questo documento semplifica l'indicizzazione dei campi in documenti più grandi. Il file JAR accetta un documento JSON di esempio come input, analizza il documento ed esegue i comandi createIndex per ogni campo senza la necessità di intervento dell'utente.

Prerequisiti

Java 21

Dopo aver distribuito la macchina virtuale, usare SSH per connettersi al computer e installare CQLSH usando i comandi seguenti:

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

File JAR di esempio per creare singoli indici per tutti i campi

Clonare il repository contenente l'esempio Java per scorrere ogni campo nella struttura del documento JSON ed eseguire operazioni createIndex per ogni campo del documento.

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

Non è necessario compilare il repository clonato se non sono presenti modifiche da apportare alla soluzione. Il file JAR eseguibile compilato denominato azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar è già incluso nella cartella runnableJar/. Il file JAR può essere eseguito specificando i parametri obbligatori seguenti:

  • Stringa di connessione del cluster Azure DocumentDB con il nome utente e la password usati al momento del provisioning del cluster
  • Database di Azure DocumentDB
  • Raccolta da indicizzare
  • Percorso del file JSON con la struttura del documento per la raccolta. Questo documento viene analizzato dal file JAR per estrarre ogni campo ed eseguire singole operazioni createIndex.
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

Tenere traccia dello stato di un'operazione createIndex

Il file JAR è progettato per non attendere una risposta da ogni operazione createIndex. Gli indici vengono creati in modo asincrono nel server e l'avanzamento dell'operazione di compilazione dell'indice nel cluster può essere monitorato.

Si consideri questo esempio per tenere traccia dello stato di avanzamento dell'indicizzazione nel database 'cosmicworks'.

use cosmicworks;
db.currentOp()

Quando è in corso un'operazione createIndex, la risposta è simile alla seguente:

{
  "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
}

Passaggi successivi