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

インデックスの作成

インデックスを定義せずに、以下のようなクエリを実行しました。

db.GqlQuery("SELECT * FROM ExModel WHERE data1='XXX' ORDER BY data2, data3")


そうすると、以下のようなエラーが出力されました。

no matching index found.
This query needs this index:
- kind: ExModel
  properties:
  - name: data1
  - name: data2
  - name: data3

…

NeedIndexError: no matching index found.
This query needs this index:
- kind: ExModel
  properties:
  - name: data1
  - name: data2
  - name: data3

単純なクエリ用のインデックス(単一のプロパティ上のクエリなど)は自動で作成されますが、複雑なクエリに対してはインデックスを index.yaml という名前の設定ファイルで定義する必要があるそうです。


index.yaml の例です。内容はエラーで出力されたままを記述すればOKです。

indexes:

- kind: ExModel
  properties:
  - name: data1
  - name: data2
  - name: data3
    direction: asc


Google app engine にアップロードし、管理コンソールの「Datastore Indexes」を確認します。「Status」が「Building」→「Serving」になれば作成完了です。
大量のデータを扱っている場合はインデックスの作成に時間がかかる場合があります。

インデックスの更新
appcfg.py update_indexes