Python 2 は、コミュニティによるサポートを終了しました。Python 2 アプリを Python 3 に移行することをおすすめします。

データストア インデックスの設定

App Engine は、アプリケーションによって行われるクエリごとに Datastore でインデックスを使用します。インデックスはエンティティが変更されるたびに更新されるので、アプリからのクエリに対してすばやく結果を返すことができます。これを実現するには、アプリケーションからどのようなクエリが実行されるかを、Datastore 側であらかじめ把握しておく必要があります。アプリケーションで必要になるインデックスは、構成ファイルで指定します。ローカルの開発用サーバーでは、アプリケーションをテストする際に、インデックス構成ファイルが自動的に生成されます。

このガイドでは、インデックスの作成方法と管理方法を説明します。 詳しい背景情報については、データストア インデックスをご覧ください。

データストア インデックスの作成

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

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

indexes:

- kind: Cat
  ancestor: no
  properties:
  - name: name
  - name: age
    direction: desc

- kind: Cat
  properties:
  - name: name
    direction: asc
  - name: whiskers
    direction: desc

- kind: Store
  ancestor: yes
  properties:
  - name: business
    direction: asc
  - name: owner
    direction: asc

開発用サーバーを使用してインデックスを作成する

開発用ウェブサーバー(dev_appserver.py)は、構成ファイルに適切なエントリを持たないインデックスを必要とするクエリをアプリケーションが実行しようとした際に、構成ファイルに自動的に項目を追加します。

開発用サーバー上でアプリのクエリを実行すると、開発用サーバーが完全なエントリリストを生成し、index.yaml ファイルに保存します。

開発用ウェブサーバーが生成されたインデックス定義を index.yaml に追加すると、次の行の下に必要に応じて定義が挿入されます。

# AUTOGENERATED

開発用ウェブサーバーは、この行の下のすべてのインデックス定義を自動インデックスとみなし、アプリケーションがクエリを実行すると、この行の下の既存の定義を更新します。

インデックスを手動で作成する

インデックスは手動で index.yaml ファイルに追加できます。また、既存のエントリを編集することもできます。手動で管理するクエリは、AUTOGENERATED でコメント化された行の上に追加する必要があります。

この行の上のインデックス定義は、すべて手動で管理されているものとみなされ、開発用ウェブサーバーによって更新されることはありません。アプリケーションによって実行されるクエリに対応するインデックスが、index.yaml ファイルのどこにも記載されていない場合に限り、開発用サーバーはこの行の下にのみ変更を加えます。自動インデックス定義を手動で管理するには、定義をこの行の上に移動します。

構文については、index.yaml リファレンスをご覧ください。

インデックスの更新

index.yaml 構成ファイルを Datastore にアップロードするには、gcloud コマンドを使用します。index.yaml ファイルに定義されているインデックスが Datastore 内に存在しない場合、そのインデックスが新たに作成されます。

Datastore がすべてのインデックスの作成に時間がかかることがあります。そのため、それらのインデックスは App Engine ですぐには使用できません。アプリがすでにトラフィックを受け取るように構成されている場合は、まだ作成中のインデックスを必要とするクエリに対して例外が発生する可能性があります。

例外を回避するには、すべてのインデックスを作成するための時間を確保する必要があります。インデックス作成の詳細と例については、Python 2 アプリのデプロイをご覧ください。

インデックス構成を Datastore にアップロードするには、index.yaml が配置されているディレクトリから次のコマンドを実行します。

gcloud

gcloud datastore indexes create index.yaml

詳細については、gcloud datastore リファレンスをご覧ください。

appcfg

appcfg.py update_indexes [YOUR_APP_DIRECTORY]

Cloud Console を使用して、インデックスのステータスを確認できます。

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

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

Datastore に残っている古いインデックスが不要であると確実にわかっている場合は、次のコマンドを実行して index.yaml ファイルで定義されていないインデックスを削除できます。

gcloud

gcloud datastore cleanup-indexes index.yaml

詳細については、gcloud datastore リファレンスをご覧ください。

appcfg

appcfg.py vacuum_indexes [YOUR_APP_DIRECTORY]