2009年9月14日月曜日

DatastoreNeedIndexException

実行時に例外が表示されるようになった。
com.google.appengine.api.datastore.DatastoreNeedIndexException : no matching index found.

表示されるようになったのは、ソートを2列で行う記述を追加してから。
query.setOrdering("geohash ASC, date DESC");

どうやらインデックスの設定が必要らしい。

GAE/Jのサイトを見ながらdatastore-indexes.xmlを記述。
参考:Java データストアのインデックスの設定 - Google App Engine - Google Code



    
        
        
    


datastore-indexes.xmlはwar/WEB-INF下に配置。
ローカルでGAE/Jサーバーを起動すると、war/WEB-INF/appengine-generated下にdatastore-indexes-auto.xmlが自動的に作成される。
この状態になってから、サーバー側へデプロイする。
そうでないとインデックスが作成されず、DatastoreNeedIndexExceptionが解消されない。

しかし、このデプロイ時に
"Deploying xxx to Google" 中に内部エラーが発生しました。
XML error validating xxx\war\WEB-INF\datastore-indexes.xml against C:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.5.v200909021031\appengine-java-sdk-1.2.5\docs\datastore-indexes.xsd
というエラーが解決できずにかなり嵌った。

結局、上記のGAE/Jのサイトにはxmlnsが含まれていたのだが、その記述が原因らしい。xmlnsを削除したら解消された。
参考:Issue 1545 - googleappengine - xml error while validating datastore-indexes.xml while deploying to appengine with sdk 1.2.1 - Project Hosting on Google Code

なんだよおー。頼みますよー。

datastore-indexes.xmlもdatastore-indexes-auto.xmlもあって、両ファイルの記述にも違いがないのにまだDatastoreNeedIndexExceptionが出る場合は、GAE/Jの管理パネルの「Datastore」→「Indexes」で作成したインデックスのステータスが「Building」ではなく「Serving」になっているか確認してください。