web-dev-qa-db-ja.com

Google App Engineエラー:NeedIndexError:一致するインデックスが見つかりません

GoogleのAppEngineインデックスに問題があります。 GoogleAppEngineLauncherを介してアプリを実行すると、アプリは正常に動作しています。アプリをデプロイすると、次のエラーが発生します。

NeedIndexError: no matching index found.
The suggested index for this query is:
- kind: Bar
  ancestor: yes
  properties:
  - name: rating
    direction: desc

このコード行の後にエラーが生成されます。

 bars = bar_query.fetch(10)

上記のコード行の前に、次のように表示されます。

bar_query = Bar.query(ancestor=guestbook_key(guestbook_name)).order(-Bar.rating)

私のindex.yamlファイルには、以下の正確な「推奨」インデックスが含まれています#AUTOGENERATED:

- kind: Bar
  ancestor: yes
  properties:
  - name: rating
    direction: desc

私は多分何かが足りないのですか? index.yamlファイルを削除し、(コマンドラインを介して)アプリを再度デプロイすると、アップロードされたファイルが1つ少なくなりました。つまり、index.yamlファイルがそこにあります。

すべてがローカルで正常に機能しています。私は最新のMacOSxに取り組んでいます。展開に使用されたコマンドは次のとおりです。

appcfg.py -A app-name --oauth2 update app

私が実装したデータストアは、ゲストブックチュートリアルアプリに大まかに基づいています。

どんな助けでも大歓迎です。

編集:

私のndb.Modelは次のように定義されています。

class Bar(ndb.Model):
    content = ndb.StringProperty(indexed=False)
    lat = ndb.FloatProperty(indexed=False)
    lon = ndb.FloatProperty(indexed=False)
    rating = ndb.IntegerProperty(indexed=True)
    url = ndb.TextProperty(indexed=False)
19
ISJ

https://appengine.google.com/datastore/indexes をチェックして、このインデックスが存在し、ステータスが「serving」に設定されているかどうかを確認します。インデックスがまだ作成されている可能性があります。

開発環境は本番環境をエミュレートします。データストアの意味でのインデックスは実際にはありません。

15
Andrei Volgin

おそらく今は少し遅れていますが、deployを単独で実行するとindex.yamlファイルが無視されるため、「gcloud appdeployindex.yaml」を実行すると役に立ちました。

他の人が言っているように、 https://appengine.google.com/datastore/indexes のダッシュボードにはしばらくの間「保留中」と表示されます。

15
Splinter

私は同じ問題に出くわしました、そしてあなたのコメントは私を正しい方向に助けました。これを処理する方法についてGoogleが言っていることは次のとおりです。

Googleのドキュメントによると、ストーリーは

gcloud app deploy 

index.yamlファイルはアップロードされません(質問はなぜですか?)。とにかく、このインデックスファイルを手動でアップロードする必要があります。

そのために、ドキュメントには次のコマンドが記載されています。

gcloud datastore create-indexes index.yaml

(index.yamlファイルの同じディレクトリからこれを実行すると仮定します)これを実行すると、データストアコンソールに移動して、インデックスが作成されたことがわかります。その後、インデックス作成が開始され(私の場合、約5分かかりました)、インデックスが提供されたら、アプリケーションを開始できます。

6
kxtronic

「index.yaml」ファイルの自動生成行の上にエラーが表示されているインデックスを移動することで、この問題を修正しました。

あなたの場合、yamlファイルは次のようになります。

indexes:
- kind: Bar
 ancestor: yes
 properties:
 - name: rating
   direction: desc

# AUTOGENERATED

次に、アプリを更新してからインデックスを更新するだけです。次のコマンドを実行してインデックスを更新します。

appcfg.py [options] update_indexes <directory>

ディレクトリはindex.yamlファイルに関連するディレクトリです。ダッシュボードの https://appengine.google.com/datastore/indexes にそのインデックスが表示されます。

更新は最初は「保留中」になりますが、インデックスに「提供中」と表示された後、クエリを実行できるようになります。

4
Evan Owen

このNeedIndexErrorは、少し異なる問題を抱えてここに到着したため、さまざまな原因でトリガーされる可能性があるため、実行できることを示すために、間違ったことをすべて説明しようと思います。

  • エンティティの種類ごとに1つのインデックスだけが必要だと思いました。 I found必要なさまざまなクエリと同じ数のインデックスが必要である限り、それは真実ではありません

  • development web serverにある間、インデックスは自動生成され、#AUTOGENERATEDファイルのindex.yaml行の下に配置されます。

  • インデックスを変更した後、最初にgcloud datastore indexes create index.yamlを使用し、インデックスがhttps://console.cloud.google.com/datastore/indexes?project=your-projectServingになるまでwaitします。

  • gcloud datastore indexes cleanup index.yamlを実行して未使用のインデックスをクリーンアップします。本番環境で使用されているインデックスは削除しないことに注意してください。参照 ここ

  • インデックスプロパティでdirectionを指定しない場合、デフォルトではASCになることに注意してください。したがって、-ソートクエリを作成しようとすると、再びエラーが発生します。

私が思うことですが、私の特定の問題よりも100%長い証拠はありませんが、一種のブレーンストーミングとして役立つと思います:

  • インデックスは、アップロード時ではなく、データのクエリ時に重要です。

  • インデックスを手動で生成している場合は、#AUTOGENERATED行を手動で作成する必要はないようです。参照 ここ

  • 開発サーバーはクエリの実行中に#AUTOGENERATED行より下のインデックスを更新するため、このレーンを追加することで「誤って」問題を解決できます。本当の問題は、gcloud datastore indexes create index.yamlコマンドを使用して手動でインデックスを更新できないことです。参照 ここ および ここ

0
vperezb

私の場合、以下のようにインデックスファイルを手動でアップロードしました。

gcloud datastore indexes create "C:\Path\of\your\project\index.yaml"

次に、更新を確認する必要があります。

Configurations to update:

descriptor:      [C:\Path\of\your\project\index.yaml]
type:            [datastore indexes]
target project:  [project_name]


Do you want to continue (Y/n)?  y

次に、データストアコンソールに移動して、次のリンクからインデックスが作成されているかどうかを確認できます: https://console.cloud.google.com/datastore/indexes

0
ASSILI Taher