インデックス作成ポリシーをカスタマイズする

完了

大量のスループットを伴うソリューションでは、項目を作成したり変更したりする個別の操作の待機時間と RU 料金の両方を削減するために、インデックスが作成されるパスの数を選択的に最適化することも珍しくありません。 これを実現するには、カスタム インデックス作成ポリシーを使ってコンテナーを作成する必要があります。

まずはシンプルな JSON ドキュメントの例から始めましょう。 このドキュメントには複数のプロパティが含まれていますが、categoryName プロパティと 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
}

生の JSON で、このインデックス作成ポリシーはまず考えられるすべてのパスを除外してから、/name/? パスと /categoryName/? パスのみを含めるように選択します。

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

注意

デモ用に、ここではすべてのパスを除外しています。 一般に、すべてのパスを既定で含めて、特定のパスのみを除外する方が、はるかに優れた方法です。

.NET SDK には一般的な JSON ポリシー オブジェクトの表現である Microsoft.Azure.Cosmos.IndexingPolicy クラスが付属しています。 このクラスの新しいインスタンスを作成するときに、対応する JSON と同じように IndexingMode プロパティと Automatic プロパティをすぐに設定できます。 この例では、インデックス作成モードは consistent に設定され、インデックスの自動作成が有効になります。

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

このクラスには ExcludedPaths コレクションも含まれていて、Add メソッドを使って ExcludedPath 型の新しいオブジェクトを追加できます。 この例では、除外するパスの一覧に /* パスが追加されます。

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

同様に、クラスには IncludedPaths コレクションが含まれています。 この例で示されているのは、/name/ですか? パスと /categoryName/? パスが含めるパスの一覧に追加されています。

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

インデックス作成ポリシーを構成したら、Microsoft.Azure.Cosmos.ContainerProperties クラスを使って、名前、パーティション キーのパス、インデックス作成ポリシーなどのコンテナーのプロパティを構成します。 次に、このクラスのインスタンスを CreateContainerIfNotExistsAsync メソッドの最初のパラメーターとして渡して、カスタム インデックス作成ポリシーを含む新しいコンテナーを作成します。

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