Banco de dados de documentos - Registros de indexação

Por padrão, o Banco de Dados de Documentos indexa automaticamente todas as propriedades de um documento assim que o documento é adicionado ao banco de dados. No entanto, você pode assumir o controle e ajustar sua própria política de indexação que reduz a sobrecarga de armazenamento e processamento quando há documentos e / ou propriedades específicos que nunca precisam ser indexados.

A política de indexação padrão que diz ao Banco de Dados de Documentos para indexar todas as propriedades automaticamente é adequada para muitos cenários comuns. Mas você também pode implementar uma política personalizada que exerce controle fino sobre exatamente o que é indexado e o que não é, e outras funcionalidades com relação à indexação.

O DocumentDB suporta os seguintes tipos de indexação -

  • Hash
  • Range

Cerquilha

O índice de hash permite uma consulta eficiente de igualdade, ou seja, ao pesquisar documentos em que uma determinada propriedade é igual a um valor exato, em vez de corresponder a um intervalo de valores como menor que, maior que ou entre.

Você pode realizar consultas de intervalo com um índice hash, mas o Banco de Dados de Documentos não será capaz de usar o índice hash para encontrar documentos correspondentes e, em vez disso, precisará digitalizar sequencialmente cada documento para determinar se ele deve ser selecionado pela consulta de intervalo.

Você não poderá classificar seus documentos com uma cláusula ORDER BY em uma propriedade que tem apenas um índice hash.

Alcance

Índice de intervalo definido para a propriedade, o Banco de Dados de Documentos permite consultar documentos com eficiência em relação a um intervalo de valores. Ele também permite que você classifique os resultados da consulta nessa propriedade, usando ORDER BY.

O DocumentDB permite que você defina um hash e um índice de intervalo em qualquer uma ou todas as propriedades, o que permite consultas de igualdade e intervalo eficientes, bem como ORDER BY.

Política de Indexação

Cada coleção tem uma política de indexação que determina quais tipos de índices são usados ​​para números e strings em cada propriedade de cada documento.

  • Você também pode controlar se os documentos são indexados automaticamente ou não à medida que são adicionados à coleção.

  • A indexação automática é ativada por padrão, mas você pode substituir esse comportamento ao adicionar um documento, dizendo ao Banco de Dados de Documentos para não indexar esse documento específico.

  • Você pode desabilitar a indexação automática para que, por padrão, os documentos não sejam indexados quando adicionados à coleção. Da mesma forma, você pode substituir isso no nível do documento e instruir o Banco de Dados de Documentos a indexar um documento específico ao adicioná-lo à coleção. Isso é conhecido como indexação manual.

Incluir / Excluir Indexação

Uma política de indexação também pode definir qual caminho ou caminhos devem ser incluídos ou excluídos do índice. Isso é útil se você sabe que há certas partes de um documento que você nunca consulta e certas partes que você faz.

Nesses casos, você pode reduzir a sobrecarga de indexação dizendo ao Banco de Dados de Documentos para indexar apenas aquelas partes específicas de cada documento adicionado à coleção.

Indexação Automática

Vamos dar uma olhada em um exemplo simples de indexação automática.

Step 1 - Primeiro criamos uma coleção chamada autoindexing e, sem fornecer explicitamente uma política, essa coleção usa a política de indexação padrão, o que significa que a indexação automática está habilitada nessa coleção.

Aqui, estamos usando o roteamento baseado em ID para o auto-link do banco de dados, portanto não precisamos saber seu ID de recurso ou consultá-lo antes de criar a coleção. Podemos apenas usar o ID do banco de dados, que é mydb.

Step 2 - Agora vamos criar dois documentos, ambos com o sobrenome 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");
}

Este primeiro, para Mark Upston, é adicionado à coleção e é imediatamente indexado automaticamente com base na política de indexação padrão.

Mas quando o segundo documento para Mark Upston é adicionado, passamos as opções de solicitação com IndexingDirective.Exclude, que instrui explicitamente o Banco de Dados de Documentos a não indexar este documento, apesar da política de indexação da coleção.

Temos diferentes tipos de consultas para ambos os documentos no final.

Step 3 - Vamos chamar a tarefa 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); 
   } 
}

Quando o código acima for compilado e executado, você receberá a seguinte saída.

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

Como você pode ver, temos dois desses documentos, mas a consulta retorna apenas aquele para Marcos porque o de Marcos não está indexado. Se consultarmos novamente, sem uma cláusula WHERE para recuperar todos os documentos na coleção, obteremos um conjunto de resultados com ambos os documentos e isso ocorre porque os documentos não indexados sempre são retornados por consultas que não têm cláusula WHERE.

Também podemos recuperar documentos não indexados por meio de seu ID ou link próprio. Portanto, quando consultamos o documento de Mark por seu ID, MARK, vemos que o Banco de Dados de Documentos retorna o documento, embora não esteja indexado na coleção.

Indexação Manual

Vamos dar uma olhada em um exemplo simples de indexação manual substituindo a indexação automática.

Step 1- Primeiro, criaremos uma coleção chamada indexação manual e substituiremos a política padrão desabilitando explicitamente a indexação automática. Isso significa que, a menos que solicitemos de outra forma, novos documentos adicionados a esta coleção não serão indexados.

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- Agora vamos criar novamente os mesmos dois documentos de antes. Não forneceremos nenhuma opção de solicitação especial para o documento de Mark neste momento, devido à política de indexação da coleção, este documento não será indexado.

Step 3 - Agora, quando adicionamos o segundo documento para Mark, usamos RequestOptions com IndexingDirective.Include para dizer ao DocumentDB que ele deve indexar este documento, o que substitui a política de indexação da coleção que diz que não deveria.

Temos diferentes tipos de consultas para ambos os documentos no final.

Step 4 - Vamos chamar a tarefa ManualIndexing de 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); 
   } 
}

Quando o código acima for compilado e executado, você receberá a seguinte saída.

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

Novamente, a consulta retorna apenas um dos dois documentos, mas, desta vez, retorna Jane Doe, que solicitamos explicitamente para ser indexado. Mas, novamente como antes, a consulta sem uma cláusula WHERE recupera todos os documentos da coleção, incluindo o documento não indexado de Mark. Também podemos consultar o documento não indexado por seu ID, que o Banco de Dados de Documentos retorna, embora não esteja indexado.