13

Ho problemi con gli indici dei motori di app di Google. Quando eseguo la mia app tramite GoogleAppEngineLauncher, l'app funziona correttamente. Quando si distribuisce l'applicazione, ottengo il seguente errore:Errore Google App Engine: NeedIndexError: nessun indice corrispondente trovato

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

L'errore viene generato dopo questa riga di codice:

bars = bar_query.fetch(10) 

Prima della riga di codice precedente, si legge:

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

Il mio file index.yaml contiene l'esatto indice "suggerito" sotto # AUTOGENERATED:

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

Mi manca forse qualcosa? Ho rimosso il file index.yaml e ho nuovamente distribuito l'app (tramite la riga di comando) e caricato un file in meno, quindi il file index.yaml è presente.

Tutto funziona correttamente localmente. Sto lavorando sull'ultimo Mac OSx. Il comando utilizzato per la distribuzione era:

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

Il datastore ho implementato è vagamente basato sul libro degli ospiti applicazione tutorial.

Qualsiasi aiuto sarebbe molto apprezzato.

EDIT:

mio ndb.Model è definito come segue:

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) 

risposta

9

Controllare https://appengine.google.com/datastore/indexes per vedere se questo indice è presente e lo stato impostato su "servire". È possibile che l'indice sia ancora in fase di costruzione.

L'ambiente di sviluppo emula l'ambiente di produzione. In realtà non ha indici in senso Datastore.

+0

Ciao @Andrei, grazie, ci sono stato. Dice: "Non hai creato indici per questa applicazione: alcuni tipi di query richiedono la creazione di un indice, puoi gestire gli indici in un file index.yaml". Su altri forum ho letto che quando si usa index.yaml non dice mai "serving". – ISJ

+0

Ho letto da qualche parte quanto segue: "L'indice che hai inserito nel tuo datastore-index.xml è un indice di proprietà singola, il che significa che è costruito automaticamente da Datastore e non verrà visualizzato nella tua console." – ISJ

+0

Hai ragione: non è necessario definire singoli indici di proprietà che non verranno visualizzati nella pagina dell'indice. Ho dimenticato di chiedere l'ovvio: questa proprietà è indicizzata? –

3

Ho risolto questo problema spostando l'indice che manca l'errore sopra la riga di generazione automatica nel file "index.yaml".

Nel tuo caso il file YAML sarà simile:

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

# AUTOGENERATED 

Poi tutto quello che dovete fare è aggiornare la vostra applicazione quindi aggiornare gli indici, si aggiornano gli indici eseguendo il comando seguente.

appcfg.py [options] update_indexes <directory> 

Con la directory è la directory relativa al file index.yaml. Dovresti quindi vedere quell'indice sulla tua dashboard al https://appengine.google.com/datastore/indexes

L'aggiornamento sarà inizialmente "in sospeso" ma dopo che l'indice dice "in servizio" potrai fare la tua richiesta.

+0

app.yaml deve essere nella stessa cartella di index.yaml affinché funzioni sopra. E la riga di comando non piace se index.yaml si trova nella cartella principale. E l'SDK non gli piace se app.yaml si trova nella cartella del percorso. Soluzione: ho dovuto inserire temporaneamente sia app.yaml che index.yaml nella cartella config. –

10

Probabilmente un po 'in ritardo ora, ma l'esecuzione di "gcloud app deploy index.yaml" è stata utile poiché l'esecuzione della distribuzione ha ignorato il file index.yaml.

Come altri hanno già detto, il cruscotto a https://appengine.google.com/datastore/indexes mostrerà "in sospeso" per un po '.

+3

Se si utilizzano i comandi appcfg.py o appcfg.sh per distribuire un'applicazione in App Engine, il file di configurazione dell'indice viene distribuito automaticamente. Se si utilizza il comando di distribuzione dell'app gcloud per distribuire l'applicazione, il file di configurazione dell'indice non viene distribuito automaticamente. È necessario specificare in modo specifico index.yaml come argomento per l'applicazione gcloud distribuire o eseguire gcloud datastore create-indexes per distribuire il file di configurazione dell'indice. – afed

2

Mi sono imbattuto nello stesso problema e i vostri commenti mi hanno aiutato nella giusta direzione. Ecco quello che Google dice come gestire questo:

Secondo la documentazione di Google la storia è che l'utilizzo

gcloud app deploy 

il file index.yaml non viene caricato (domanda perché non lo è?). Ad ogni modo, si deve caricare manualmente questo file indice.

Per fare ciò, la documentazione ha pronunciato la seguente comando:

gcloud datastore create-indexes index.yaml 

(supponendo si esegue questo dalla stessa directory del file index.yaml) Una volta fatto questo si può andare al Datastore console e vedrai che l'indice è stato creato. Inizierà quindi a essere indicizzato (nel mio caso ci sono voluti circa 5 minuti) e una volta che l'indice viene servito puoi avviare la tua richiesta.