DocumentDB - Indexation des enregistrements

Par défaut, DocumentDB indexe automatiquement toutes les propriétés d'un document dès que le document est ajouté à la base de données. Cependant, vous pouvez prendre le contrôle et affiner votre propre politique d'indexation qui réduit la surcharge de stockage et de traitement lorsqu'il existe des documents et / ou des propriétés spécifiques qui n'ont jamais besoin d'être indexés.

La stratégie d'indexation par défaut qui indique à DocumentDB d'indexer automatiquement chaque propriété convient à de nombreux scénarios courants. Mais vous pouvez également implémenter une stratégie personnalisée qui exerce un contrôle précis sur exactement ce qui est indexé et ce qui ne l'est pas et d'autres fonctionnalités en ce qui concerne l'indexation.

DocumentDB prend en charge les types d'indexation suivants -

  • Hash
  • Range

Hacher

L'index de hachage permet une interrogation efficace pour l'égalité, c'est-à-dire lors de la recherche de documents où une propriété donnée est égale à une valeur exacte, plutôt que d'une correspondance sur une plage de valeurs comme inférieure à, supérieure à ou entre.

Vous pouvez effectuer des requêtes de plage avec un index de hachage, mais DocumentDB ne pourra pas utiliser l'index de hachage pour trouver les documents correspondants et devra à la place analyser séquentiellement chaque document pour déterminer s'il doit être sélectionné par la requête de plage.

Vous ne pourrez pas trier vos documents avec une clause ORDER BY sur une propriété qui n'a qu'un index de hachage.

Intervalle

Index de plage défini pour la propriété, DocumentDB permet d'interroger efficacement des documents par rapport à une plage de valeurs. Il vous permet également de trier les résultats de la requête sur cette propriété, en utilisant ORDER BY.

DocumentDB vous permet de définir à la fois un hachage et un index de plage sur une ou toutes les propriétés, ce qui permet des requêtes d'égalité et de plage efficaces, ainsi que ORDER BY.

Politique d'indexation

Chaque collection a une politique d'indexation qui dicte quels types d'index sont utilisés pour les nombres et les chaînes dans chaque propriété de chaque document.

  • Vous pouvez également contrôler si les documents sont indexés automatiquement lorsqu'ils sont ajoutés à la collection.

  • L'indexation automatique est activée par défaut, mais vous pouvez remplacer ce comportement lors de l'ajout d'un document, en indiquant à DocumentDB de ne pas indexer ce document particulier.

  • Vous pouvez désactiver l'indexation automatique afin que, par défaut, les documents ne soient pas indexés lorsqu'ils sont ajoutés à la collection. De même, vous pouvez remplacer cela au niveau du document et demander à DocumentDB d'indexer un document particulier lors de son ajout à la collection. C'est ce qu'on appelle l'indexation manuelle.

Inclure / exclure l'indexation

Une politique d'indexation peut également définir le ou les chemins à inclure ou à exclure de l'index. Ceci est utile si vous savez qu'il existe certaines parties d'un document sur lesquelles vous n'interrogez jamais et certaines parties que vous faites.

Dans ces cas, vous pouvez réduire la surcharge d'indexation en demandant à DocumentDB d'indexer uniquement les parties particulières de chaque document ajouté à la collection.

Indexation automatique

Jetons un coup d'œil à un exemple simple d'indexation automatique.

Step 1 - Tout d'abord, nous créons une collection appelée auto-indexation et sans fournir explicitement de politique, cette collection utilise la politique d'indexation par défaut, ce qui signifie que l'indexation automatique est activée sur cette collection.

Ici, nous utilisons le routage basé sur l'ID pour la liaison automatique de la base de données, nous n'avons donc pas besoin de connaître son ID de ressource ou de l'interroger avant de créer la collection. Nous pouvons simplement utiliser l'ID de la base de données, qui est mydb.

Step 2 - Créons maintenant deux documents, tous deux portant le nom d'Upston.

private async static Task AutomaticIndexing(DocumentClient client) {
   Console.WriteLine();
   Console.WriteLine("**** Override Automatic Indexing ****");

   // Create collection with automatic indexing

   var collectionDefinition = new DocumentCollection {
      Id = "autoindexing"
   };
	
   var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
      collectionDefinition);

   // Add a document (indexed)
   dynamic indexedDocumentDefinition = new {
      id = "MARK",
      firstName = "Mark",
      lastName = "Upston",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document indexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/autoindexing", indexedDocumentDefinition);
		
   // Add another document (request no indexing)
   dynamic unindexedDocumentDefinition = new {
      id = "JANE",
      firstName = "Jane",
      lastName = "Upston",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document unindexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/autoindexing", unindexedDocumentDefinition,
      new RequestOptions { IndexingDirective = IndexingDirective.Exclude });

   //Unindexed document won't get returned when querying on non-ID (or selflink) property

   var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing", "SELECT *
      FROM c WHERE c.lastName = 'Doe'").ToList();
		
   Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);

   // Unindexed document will get returned when using no WHERE clause

   var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
      "SELECT * FROM c").ToList();
   Console.WriteLine("All documents: {0}", allDocs.Count);
	
   // Unindexed document will get returned when querying by ID (or self-link) property
	
   Document janeDoc = client.CreateDocumentQuery("dbs/mydb/colls/autoindexing",
      "SELECT * FROM c WHERE c.id = 'JANE'").AsEnumerable().FirstOrDefault();
   Console.WriteLine("Unindexed document self-link: {0}", janeDoc.SelfLink);
	
   // Delete the collection
	
   await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/autoindexing");
}

Ce premier, pour Mark Upston, est ajouté à la collection et est ensuite immédiatement indexé automatiquement en fonction de la politique d'indexation par défaut.

Mais lorsque le deuxième document pour Mark Upston est ajouté, nous avons passé les options de requête avec IndexingDirective.Exclude qui indique explicitement à DocumentDB de ne pas indexer ce document, malgré la politique d'indexation de la collection.

Nous avons différents types de requêtes pour les deux documents à la fin.

Step 3 - Appelons la tâche AutomaticIndexing de CreateDocumentClient.

private static async Task CreateDocumentClient() {
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { 
      await AutomaticIndexing(client); 
   } 
}

Lorsque le code ci-dessus est compilé et exécuté, vous recevrez la sortie suivante.

**** Override Automatic Indexing **** 
Documents WHERE lastName = 'Upston': 1 
All documents: 2 
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oAOEkfQA=/docs/kV5oAOEkfQACA 
AAAAAAAAA==/

Comme vous pouvez le voir, nous avons deux de ces documents, mais la requête ne renvoie que celui de Mark car celui de Mark n'est pas indexé. Si nous interrogeons à nouveau, sans clause WHERE pour récupérer tous les documents de la collection, alors nous obtenons un jeu de résultats avec les deux documents et c'est parce que les documents non indexés sont toujours retournés par des requêtes qui n'ont pas de clause WHERE.

Nous pouvons également récupérer des documents non indexés par leur identifiant ou leur auto-lien. Ainsi, lorsque nous interrogeons le document de Mark par son ID, MARK, nous voyons que DocumentDB renvoie le document même s'il n'est pas indexé dans la collection.

Indexation manuelle

Jetons un coup d'œil à un exemple simple d'indexation manuelle en remplaçant l'indexation automatique.

Step 1- Nous allons d'abord créer une collection appelée indexation manuelle et remplacer la politique par défaut en désactivant explicitement l'indexation automatique. Cela signifie que, sauf demande contraire de notre part, les nouveaux documents ajoutés à cette collection ne seront pas indexés.

private async static Task ManualIndexing(DocumentClient client) {
   Console.WriteLine();
   Console.WriteLine("**** Manual Indexing ****");
   // Create collection with manual indexing

   var collectionDefinition = new DocumentCollection {
      Id = "manualindexing",
      IndexingPolicy = new IndexingPolicy {
         Automatic = false,
      },
   };
	
   var collection = await client.CreateDocumentCollectionAsync("dbs/mydb",
      collectionDefinition);
		
   // Add a document (unindexed)
   dynamic unindexedDocumentDefinition = new {
      id = "MARK",
      firstName = "Mark",
      lastName = "Doe",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   }; 
	
   Document unindexedDocument = await client
      .CreateDocumentAsync("dbs/mydb/colls/manualindexing", unindexedDocumentDefinition);
  
   // Add another document (request indexing)
   dynamic indexedDocumentDefinition = new {
      id = "JANE",
      firstName = "Jane",
      lastName = "Doe",
      addressLine = "123 Main Street",
      city = "Brooklyn",
      state = "New York",
      zip = "11229",
   };
	
   Document indexedDocument = await client.CreateDocumentAsync
      ("dbs/mydb/colls/manualindexing", indexedDocumentDefinition, new RequestOptions {
      IndexingDirective = IndexingDirective.Include });

   //Unindexed document won't get returned when querying on non-ID (or selflink) property

   var doeDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c WHERE c.lastName = 'Doe'").ToList();
   Console.WriteLine("Documents WHERE lastName = 'Doe': {0}", doeDocs.Count);
	
   // Unindexed document will get returned when using no WHERE clause
	
   var allDocs = client.CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c").ToList();
   Console.WriteLine("All documents: {0}", allDocs.Count);
	
   // Unindexed document will get returned when querying by ID (or self-link) property
	
   Document markDoc = client
      .CreateDocumentQuery("dbs/mydb/colls/manualindexing",
      "SELECT * FROM c WHERE c.id = 'MARK'")
      .AsEnumerable().FirstOrDefault();
   Console.WriteLine("Unindexed document self-link: {0}", markDoc.SelfLink);
   await client.DeleteDocumentCollectionAsync("dbs/mydb/colls/manualindexing");
}

Step 2- Nous allons maintenant créer à nouveau les deux mêmes documents qu'auparavant. Nous ne fournirons aucune option de demande spéciale pour le document de Mark cette fois, en raison de la politique d'indexation de la collection, ce document ne sera pas indexé.

Step 3 - Maintenant, lorsque nous ajoutons le deuxième document pour Mark, nous utilisons RequestOptions avec IndexingDirective.Include pour indiquer à DocumentDB qu'il doit indexer ce document, ce qui remplace la politique d'indexation de la collection qui dit qu'il ne devrait pas.

Nous avons différents types de requêtes pour les deux documents à la fin.

Step 4 - Appelons la tâche ManualIndexing depuis CreateDocumentClient.

private static async Task CreateDocumentClient() {
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
      await ManualIndexing(client); 
   } 
}

Lorsque le code ci-dessus est compilé et exécuté, vous recevrez la sortie suivante.

**** Manual Indexing **** 
Documents WHERE lastName = 'Upston': 1 
All documents: 2 
Unindexed document self-link: dbs/kV5oAA==/colls/kV5oANHJPgE=/docs/kV5oANHJPgEBA 
AAAAAAAAA==/

Encore une fois, la requête ne renvoie qu'un seul des deux documents, mais cette fois, elle renvoie Jane Doe, dont nous avons explicitement demandé l'indexation. Mais encore une fois, une requête sans clause WHERE récupère tous les documents de la collection, y compris le document non indexé pour Mark. Nous pouvons également rechercher le document non indexé par son ID, que DocumentDB renvoie même s'il n'est pas indexé.