Personalizar a política de indexação

Concluído

Em uma solução com uma grande quantidade de taxa de transferência, não é incomum otimizar seletivamente o número de caminhos indexados para reduzir a latência e o custo de RU de operações individuais que criam ou modificam um item. Para fazer isso, você precisaria criar um contêiner usando uma política de indexação personalizada.

Vamos começar com um documento JSON de exemplo simples. Esse documento tem várias propriedades, mas a meta é indexar apenas as propriedades categoryName e name.

{
  "id": "8B363B8B-378E-402A-9E68-A935302000B8",
  "name": "HL Touring Frame - Yellow, 46",
  "categoryId": "F3FBB167-11D8-41E4-84B4-5AAA92B1E737",
  "categoryName": "Components, Touring Frames",
  "sku": "FR-T98Y-46",
  "price": 1003.91
}

Em JSON bruto, essa política de indexação começaria excluindo todos os caminhos possíveis e, em seguida, optando por incluir apenas os caminhos /name/? e /categoryName/?.

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/name/?"
    },
    {
      "path": "/categoryName/?"
    }
  ],
  "excludedPaths": [
    {
      "path": "/*"
    }
  ]
}

Observação

Estamos excluindo todos os caminhos aqui para fins de demonstração. Em geral, é muito melhor incluir todos os caminhos por padrão e excluir apenas caminhos específicos.

O SDK do .NET é produzido com uma classe Microsoft.Azure.Cosmos.IndexingPolicy que é uma representação do objeto de política JSON típico. Ao criar uma instância da classe, você pode definir imediatamente as propriedades IndexingMode e Automatic muito como suas contrapartes JSON. Nesse exemplo, o modo de indexação é definido como consistente e a indexação automática está habilitada.

IndexingPolicy policy = new ()
{
    IndexingMode = IndexingMode.Consistent,
    Automatic = true
};

A classe também inclui uma coleção ExcludedPaths com um método Add para adicionar um novo objeto do tipo ExcludedPath. Nesse exemplo, o caminho /* é adicionado à lista de caminhos excluídos.

policy.ExcludedPaths.Add(
    new ExcludedPath{ Path = "/*" }
);

Da mesma forma, a classe inclui uma coleção IncludedPaths. Esse exemplo ilustra os caminhos /name/? e /categoryName/? sendo adicionados à lista de caminhos incluídos.

policy.IncludedPaths.Add(
    new IncludedPath{ Path = "/name/?" }
);
policy.IncludedPaths.Add(
    new IncludedPath{ Path = "/categoryName/?" }
);

Depois que a política de indexação estiver configurada, a classe Microsoft.Azure.Cosmos.ContainerProperties será usada para configurar propriedades de um contêiner, como nome, caminho de chave de partição e política de indexação. Essa instância de classe é passada para o método CreateContainerIfNotExistsAsync como o primeiro parâmetro para criar um contêiner com a política de indexação personalizada.

ContainerProperties options = new ()
{
    Id = "products",
    PartitionKeyPath = "/categoryId",
    IndexingPolicy = policy
};
Container container = await database.CreateContainerIfNotExistsAsync(options, throughput: 400);