Dela via


Skapa wildcard-index i Azure DocumentDB

Belastningar som har en oförutsägbar uppsättning fält i schemat kan använda index med jokertecken för att stödja frågeställningar mot godtyckliga eller okända fält för att optimera prestandan.

Wildcard-indexering kan vara användbar i följande scenarier:

  • Frågor som filtrerar på valfritt fält i dokumentet, vilket gör indexering av alla fält via ett enda kommando enklare än att indexera varje fält individuellt.
  • Frågor som filtrerar på de flesta fält i dokumentet gör indexering av alla utom ett fåtal fält via en enda enklare än att indexera de flesta fält individuellt.

Indexera alla fält

Konfigurera ett jokerteckenindex för att underlätta frågor om alla möjliga dokumentfält, inklusive de med okända eller dynamiska namn.

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

Viktigt!

För stora samlingar rekommenderar vi att du använder en alternativ metod som definieras senare i det här dokumentet.

Inkludera eller exkludera specifika fält

Jokerteckenindex kan också begränsas till specifika fält samtidigt som vissa fält undantas från indexering. Nu ska vi granska ett exempel på följande json.

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

Vi kan styra indexeringsbeteendet. Exemplet begränsar skapandet av index i firstNamefältet ,lastName & timeInOrgInYears .

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

I dokumentet wildcardProjection anger värdet 0 eller 1 om fältet inkluderas (1) eller exkluderas (0) från indexering.

Alternativ för indexering av alla fält

Det här exemplet beskriver en enkel lösning för att minimera det arbete som krävs för att skapa enskilda index tills jokerteckenindexering är allmänt tillgängligt i Azure DocumentDB.

Överväg json-dokumentet nedan:

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

Följande index skapas under täcket när jokerteckenindexering används.

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

Även om det här exempeldokumentet bara kräver att en kombination av 10 fält uttryckligen indexeras, kan större dokument med hundratals eller tusentals fält bli omständliga och felbenägna vid indexering av fält individuellt.

Jar-filen som beskrivs i resten av det här dokumentet gör indexeringsfält i större dokument enklare. Jar-filen tar ett JSON-exempeldokument som indata, parsar dokumentet och kör createIndex-kommandon för varje fält utan att användaren behöver ingripa.

Förutsättningar

Java 21

När den virtuella datorn har distribuerats använder du SSH för att ansluta till datorn och installerar CQLSH med hjälp av kommandona nedan:

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

Exempelburk för att skapa enskilda index för alla fält

Klona lagringsplatsen som innehåller Java-exemplet för att iterera genom varje fält i JSON-dokumentets struktur och utfärda createIndex-åtgärder för varje fält i dokumentet.

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

Den klonade lagringsplatsen behöver inte skapas om det inte finns några ändringar att göra i lösningen. Den inbyggda runnable jar med namnet azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar ingår redan i mappen runnableJar/. Jar-filen kan köras genom att ange följande obligatoriska parametrar:

  • Anslutningssträng för Azure DocumentDB-kluster med användarnamnet och lösenordet som användes när klustret etablerades
  • Azure DocumentDB-databasen
  • Samlingen som ska indexeras
  • Platsen för json-filen med dokumentstrukturen för samlingen. Det här dokumentet parsas av jar-filen för att extrahera varje fält och utfärda enskilda createIndex-åtgärder.
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

Spåra status för en createIndex-åtgärd

Jar-filen är utformad för att inte vänta på ett svar från varje createIndex-åtgärd. Indexen skapas asynkront på servern och förloppet för indexgenereringsåtgärden i klustret kan spåras.

Överväg det här exemplet för att spåra indexeringsstatusen i databasen "cosmicworks".

use cosmicworks;
db.currentOp()

När en createIndex-åtgärd pågår ser svaret ut så här:

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

Nästa steg