13

Mam problemy z indeksami Google App Engine. Gdy uruchomisz moją aplikację przez GoogleAppEngineLauncher, aplikacja działa poprawnie. Podczas wdrażania aplikacji, pojawia się następujący błąd:Błąd Google App Engine: NeedIndexError: nie znaleziono zgodnego indeksu

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

Błąd jest generowany po tej linii kodu:

bars = bar_query.fetch(10) 

przed wyżej linii kodu, to brzmi:

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

Mój plik index.yaml zawiera dokładny "sugerowany" indeks poniżej # AUTOGENERACJA:

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

Czy może czegoś brakuje? Usunąłem plik index.yaml i ponownie wdrożyłem aplikację (za pośrednictwem wiersza poleceń) i przesłano jeden mniej plik - tak więc istnieje plik index.yaml.

Wszystko działa dobrze lokalnie. Pracuję nad najnowszym systemem Mac OSx. Komenda użyta do wdrożenia:

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

Baza danych, którą zaimplementowałem, jest luźno oparta na samouczku księgowym.

Każda pomoc zostanie bardzo doceniona.

EDIT:

My ndb.Model jest zdefiniowany następująco:

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) 

Odpowiedz

9

Sprawdź https://appengine.google.com/datastore/indexes aby sprawdzić, czy wskaźnik ten jest obecny i stan ustawiony na "służbie". Możliwe, że indeks nadal jest tworzony.

Środowisko programistyczne emuluje środowisko produkcyjne. W rzeczywistości nie ma indeksów w sensie Datastore.

+0

Witam @Andrei, dzięki, byłem tam. Mówi: "Nie utworzono indeksów dla tej aplikacji. Niektóre typy zapytań wymagają zbudowania indeksu. Możesz zarządzać indeksami w pliku index.yaml." Na innych forach czytałem, że podczas korzystania z index.yaml nigdy nie mówi "służba". – ISJ

+0

Przeczytałem gdzieś: "Indeks, który umieściłeś w swoim datastore-index.xml, jest pojedynczym indeksem właściwości, co oznacza, że ​​jest on automatycznie budowany przez Datastore i nie pojawi się w twojej konsoli." – ISJ

+0

Masz rację - indeksy pojedynczych nieruchomości nie muszą być zdefiniowane i nie będą wyświetlane na stronie indeksu. Zapomniałem zapytać o oczywiste: czy ta właściwość jest indeksowana? –

3

Rozwiązałem ten problem, przesuwając indeks, którego brakuje w komunikacie powyżej linii automatycznego generowania w pliku "index.yaml".

W twoim przypadku plik yaml będzie wyglądać następująco:

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

# AUTOGENERATED 

Następnie wszystko co musisz zrobić, to zaktualizować swoją aplikację następnie zaktualizować indeksy, indeksy zaktualizować, uruchamiając następującą komendę.

appcfg.py [options] update_indexes <directory> 

Z katalogiem będącym katalogiem względem pliku index.yaml. Powinieneś wtedy zobaczyć ten indeks na desce rozdzielczej pod adresem: https://appengine.google.com/datastore/indexes

Aktualizacja będzie początkowo "oczekująca", ale po tym jak indeks powie "służba", będziesz mógł wykonać zapytanie.

+0

app.yaml musi znajdować się w tym samym folderze co index.yaml, aby powyższe działało. A wiersz polecenia nie podoba się, jeśli index.yaml znajduje się w folderze głównym. I SDK nie podoba się, jeśli app.yaml jest w folderze trasy. Rozwiązanie: Musiałem tymczasowo umieścić zarówno app.yaml, jak i index.yaml w folderze config. –

10

Prawdopodobnie trochę późno, ale uruchomiona aplikacja "gcloud app index.yaml" pomogła, ponieważ uruchomienie wdrożenia samo zignorowało plik index.yaml.

Jak powiedzieli inni, pulpit nawigacyjny pod numerem https://appengine.google.com/datastore/indexes będzie przez chwilę wyświetlany "oczekujący".

+3

Jeśli użyjesz komend appcfg.py lub appcfg.sh do wdrożenia aplikacji w App Engine, plik konfiguracyjny indeksu zostanie automatycznie wdrożony. Jeśli użyjesz komendy wdrażania aplikacji gcloud do wdrożenia aplikacji, plik konfiguracyjny indeksu nie zostanie automatycznie wdrożony. Musisz podać listę index.yaml jako argument do wdrożenia aplikacji gcloud lub uruchomić gcloud datastore create-indexes, aby wdrożyć plik konfiguracyjny indeksu. – afed

2

Natknąłem się na ten sam problem, a twoje komentarze pomogły mi we właściwym kierunku. Oto co Google mówi, jak sobie z tym poradzić:

Zgodnie z dokumentacją Google historia jest, że za pomocą

gcloud app deploy 

plik index.yaml nie zostanie dodane (pytanie brzmi: dlaczego nie?). W każdym razie, należy ręcznie załadować ten plik indeksu.

Aby to zrobić, dokumentacja daje następujące polecenie:

gcloud datastore create-indexes index.yaml 

(zakładając wykonać to z tego samego katalogu pliku index.yaml) Po dokonaniu tego można przejść do magazynu danych i zobaczysz, że indeks został utworzony. Zostanie on zaindeksowany (w moim przypadku trwało to około 5 minut) i po wyświetleniu indeksu można uruchomić aplikację.