インデックスの構成

Datastore モードの Firestore はアプリケーションからのすべてのクエリにインデックスを使用します。インデックスは、エンティティが変更されるたびに更新されるため、アプリケーションからのクエリにはすばやく結果が返されます。Datastore モードには組み込みインデックスを自動的に作成する機能がありますが、どの複合インデックスがアプリケーションに必要になるかをあらかじめ認識させる必要があります。アプリケーションに必要な複合インデックスは、構成ファイルで指定します。Datastore エミュレータは、アプリケーションのテストの際に Datastore モード インデックス構成を自動的に生成できます。gcloud コマンドライン ツールには、本番環境用の Datastore モード データベースで利用可能なインデックスを更新するコマンドがあります。

システム要件

gcloud ツールを使用するには、Google Cloud SDK がインストール済みであることが必要です。

index.yaml について

アプリケーションで実行されるすべての Datastore モードのクエリには、対応するインデックスが必要です。単純なクエリ用のインデックス(1 つのプロパティに関するクエリなど)は自動的に作成されます。複雑なクエリ用のインデックスは、index.yaml という構成ファイルで定義する必要があります。このファイルはアプリケーションとともにアップロードされ、Datastore モードのデータベースにインデックスを作成します。

Datastore エミュレータは、構成ファイルに適切なエントリを持たないインデックスを必要とするクエリをアプリケーションで実行しようとした際に、構成ファイルに自動的に項目を追加します。構成ファイルを編集して、インデックスを手動で変更したり、新規に作成したりすることもできます。index.yaml<project-directory>/WEB-INF/ フォルダにあります。デフォルトでは、WEB-INF/appengine-generated/index.yaml が含まれるデータ ディレクトリは ~/.config/gcloud/emulators/datastore/ です。詳細については、Datastore エミュレータのプロジェクト ディレクトリをご覧ください。

index.yaml ファイルの例を次に示します。

indexes:

- kind: Task
  ancestor: no
  properties:
  - name: done
  - name: priority
    direction: desc

- kind: Task
  properties:
  - name: collaborators
    direction: asc
  - name: created
    direction: desc

- kind: TaskList
  ancestor: yes
  properties:
  - name: percent_complete
    direction: asc
  - name: type
    direction: asc

index.yaml の構文は YAML 形式です。この構文について詳しくは、YAML のウェブサイトをご覧ください。

インデックスの定義

index.yaml には、indexes という名前のリスト要素が 1 つだけあります。このリストに含まれる各要素は、アプリケーションのインデックスを表します。

インデックス要素には、次のような要素があります。

kind
クエリに対応するエンティティの種類です。この要素は必須です。
properties

インデックスの列として組み込むプロパティのリストです。まず、等式フィルタで使用するプロパティ、次に不等式フィルタで使用するプロパティの順に整理してから、並べ替え順序とその方向を指定します。

このリスト内の各要素には、次の要素を指定します。

name
プロパティの Datastore モード名です。
direction
並べ替えの方向です。昇順の場合は asc を指定し、降順の場合は desc を指定します。この値は、クエリの並べ替え順序で使用するプロパティについてのみ必要です。また、クエリで使用する方向と同じである必要があります。デフォルトは asc です。
ancestor

クエリに祖先句がある場合は yes。デフォルトは no

自動インデックスと手動インデックス

Datastore エミュレータが、生成されたインデックス定義を index.yaml に追加すると、次の行の下で必要に応じて定義が挿入されます。

# AUTOGENERATED

エミュレータは、この行の下のすべてのインデックス定義を自動インデックスとみなし、アプリケーションがクエリを実行すると、この行の下の既存の定義を更新します。

この行の上のインデックス定義は、すべて手動で管理されているものとみなされ、エミュレータによって更新されることはありません。アプリケーションで実行されるクエリを説明するインデックスが、完全な index.yaml ファイルに記載されていない場合、エミュレータは行の下のみを変更します。自動インデックス定義を管理するには、この行を上に移動します。

インデックスの更新

datastore indexes create コマンドは、ローカルの Datastore インデックス構成(index.yaml ファイル)を確認し、本番環境用の Datastore モード データベースにまだ存在していないインデックスがインデックス構成で定義されていると、データベースは新しいインデックスを作成します。indexes create の使用方法の例については、gcloud ツールを使用した開発ワークフローをご覧ください。

新しいインデックスに帰属するデータがデータベースにどれくらい存在するかによって、インデックス作成プロセスにはそれ相応の時間がかかります。まだ作成が完了していないインデックスを要求するクエリをアプリケーションが実行すると、例外が発生します。これを防ぐには、まだ作成が完了していない新しいインデックスを要求する新しいバージョンのアプリケーションのデプロイに注意する必要があります。

インデックスのステータスは、Cloud Console の [インデックス] ページで確認できます。

使用されていないインデックスの削除

インデックス構成でインデックスを変更または削除する場合、元のインデックスは Datastore モードのデータベースから自動的に削除されません。これにより、新しいインデックスを作成しながらアプリケーションの古いバージョンを実行したり、新しいバージョンで問題が発見されたらすぐに古いバージョンを復元したりできます。

古いインデックスが確実に不要な場合は、datastore indexes cleanup コマンドでインデックスを削除できます。このコマンドは、本番環境用の Datastore モード インスタンスのインデックスのうち、ローカル バージョンの index.yaml に存在しないものをすべて削除します。indexes cleanup の使用方法の例については、gcloud ツールを使用した開発ワークフローをご覧ください。

コマンドライン引数

インデックスの作成およびクリーンアップ用のコマンドライン引数の詳細については、それぞれ datastore indexes createdatastore indexes cleanup をご覧ください。gcloud ツールのコマンドライン引数の詳細については、gcloud ツールのリファレンスをご覧ください。