6

sto cercando di interrogare l'archivio dati, e la mia domanda è simile al seguente:Problemi con query GQL, Google Datastore. Errore con più condizioni e maggiore e minore di operatori

SELECT * 
FROM mydb 
WHERE Latitude = "18.1" AND Number > "1" 

Non funziona però. Ottengo questo errore nella casella di ricerca Datastore:

GQL query error: Your Datastore does not have the composite index (developer-supplied) required for this query.

E questo errore quando ho eseguito il mio codice:

no matching index found. recommended index is:\n- kind: mydb\n properties:\n - name: Location\n - name: Number\n

richieste semplici come questo lavoro:

SELECT * 
FROM mydb 
WHERE Number > "1" AND Number < "5" 

sto solo accedendo una singola colonna qui forse è per questo?

No,

Poi ho provato una richiesta del genere:

SELECT * 
FROM mydb 
WHERE Latitude = "18.1" AND Number = "1" 

Questo ha funzionato.

ho provato a cercare una soluzione e mi sono imbattuto in questa pagina: https://cloud.google.com/datastore/docs/tools/indexconfig#Datastore_About_index_yaml

Dopo aver attraversato la pagina, ho capito che ho bisogno di un file index.yaml da qualche parte. Dovrebbe andare in una cartella chiamata WEB-INF. Ma non ho questa cartella.

Si tratta di un piccolo frammento del mio codice:

Query<Entity> query = Query 
       .gqlQueryBuilder(Query.ResultType.ENTITY, 
         "SELECT * FROM " + kind + " WHERE Location = @location AND Number <= @number") 
       .setBinding("number", "5").setBinding("location", "18.1").build(); 
QueryResults<Entity> results = datastore.run(query); 
+0

Dove si trova il tuo 'appengine-web.xml'? – Nicholas

+0

@Nicholas Non ce l'ho da nessuna parte, il mio programma può essere distribuito ed eseguito senza di esso. –

+0

Puoi pubblicare la struttura completa della directory della tua applicazione? – Nicholas

risposta

2

L'errore che si ottiene è perché la query che si sta tentando richiede Composite indexes che non sono disponibili per impostazione predefinita. Devono essere specificati all'interno di index.yaml.

L'articolo Creating index files che è leggermente diverso da quello pubblicato è specifico per le applicazioni Java in esecuzione nell'ambiente flessibile.

Ci sono 2 modi per creare un index.yaml:

  1. utilizzando manualmente un editor di testo seguendo le regole e la struttura come prescritto in Index definitions.
  2. Generare il file mentre si esegue il test localmente. Questo può essere fatto usando il comando gcloud beta emulators datastore start. È inoltre possibile utilizzare l'opzione --data-dir <dir> per specificare dove deve essere scritto lo index.yaml generato.

Poi, una volta che hai index.yaml e la stessa directory app.yaml, è possibile distribuire con gcloud preview app deploy index.yaml da quella directory. Questo processo è brevemente documentato in Deploying the index file.

Vorrei anche leggere Organizing yaml Configuration Files.

+0

Grazie, vado avanti e provo, ma ci sono due posti che contengono i file app.yaml, uno è in src/main/appengine e l'altro è in target/appengine-staging. In quale directory devo inserire index.yaml? –

+0

'src/main/appengine' come presumo dove stai eseguendo' gcloud preview app deploy' – Nicholas

+0

Grazie, darò uno scatto e ti faccio sapere come va. –

Problemi correlati