前回、
Google App Engine (GAE) とGoogle Cloud Datastore (GCD)の連携について紹介しました。データの追加や検索は簡単なことが判っていただけたと思いますが、システムが大きくなると複雑な検索条件が必要になります。検索条件が複雑になると検索速度を早くするため、インデックスを利用する必要が出てきます。今回はGAEからGCDのインデックスの作成方法について紹介したいと思います。
1プロパティに対するインデックス
前回の紹介のときも簡単に紹介しましたが、1プロパティに対するインデックスはclassの設定で行うことができます。
class Users(ndb.Model):
name = ndb.StringProperty(indexed=True)
age = ndb.IntegerProperty(indexed=False)
created_at = ndb.DateTimeProperty(indexed=False)
上記のnameプロパティのように「indexed=True」とするたけでOKです。このインデックスがあることにより、次のようにnameプロパティで検索を行うことができました。
query = Users.query(Users.name == 'hoge')
user = query.get()
もし、検索条件にインデックスを張っていない場合は、どのようになるのでしょうか。次のようにインデックスを張っていないageプロパティを用い、検索してみましょう。
query = Users.query(Users.age == 25)
user = query.get()
結果、次のようなエラーが発生しました。
BadFilterError: invalid filter: Cannot query for unindexed property age.
age = ndb.IntegerProperty(indexed=True)
のようにインデックスを有効にすることで問題は解決します。
複数プロパティに対するインデックス
では2つ以上のプロパティを検索条件とする場合は、どのようにインデックスを設定すればよろしいでしょうか。このような複合インデックスは、classに定義することはできません。この場合、「index.yaml」を用います。例えば、nameプロパティとageプロパティの複合インデックスの作り方を紹介します。「index.yaml」を作成し、次のように記述してください。
indexes:
- kind: Users
properties:
- name: name
- name: age
上記が最も簡単な作成方法になります。
- kind … エンティティ名
- properties … プロパティ
各プロパティには次のような値を設定します。
- name … プロパティ名
- direction … asc: 昇順, desc: 降順
もしこの記述を忘れてしまうと、実行時にエラーになります。ただし、エラーのログを確認するとどのようにインデックスを設定すればいいか記されていますので、それをそのままコピペして利用してもよいでしょう。
まとめ
いかがでしたでしょうか。一度複合インデックスを作成すれば、その記述が簡単であることがわかるでしょう。また「index.yaml」に記述しますので、事前にGCD上での設定は不要です。ぜひ活用してください。