2013-07-02 12 views
5

** UPDATE **Google Cloud Datastore runQuery powrocie 412 „nie znaleziono zgodnego index”

Dzięki Alfred Fullera dla wskazując, że trzeba utworzyć ręcznie indeks dla tego zapytania.

Niestety, korzystając z interfejsu API JSON, z aplikacji .NET, nie wydaje się, aby był to oficjalnie obsługiwany sposób. W rzeczywistości nie wydaje się, aby w ogóle było to możliwe z aplikacji spoza App Engine, co jest dziwne, ponieważ interfejs API Cloud Datastore został zaprojektowany, aby umożliwić dostęp do Datastore poza App Engine.

Najbliższym hackem, jaki mogłem znaleźć, było POST the index definition using RPC do http://appengine.google.com/api/datastore/index/add. Czy ktoś może mi podać surową specyfikację tego, jak to zrobić dokładnie (np. Parametry URL, jak dokładnie powinno wyglądać ciało itp.), Być może używając Fiddlera do sprawdzenia połączenia wykonanego przez appcfg.cmd?

** oryginalne pytanie **

Według docs „kwerenda może łączyć równości (równe) filtry dla różnych właściwości, wraz z jednym lub więcej filtrów nierówności na jednym własności”.

Jednak ta kwerenda nie powiedzie się:

{ 
"query": { 
    "kinds": [ 
    { 
    "name": "CodeProse.Pogo.Tests.TestPerson" 
    } 
    ], 
    "filter": { 
    "compositeFilter": { 
    "operator": "and", 
    "filters": [ 
    { 
     "propertyFilter": { 
     "operator": "equal", 
     "property": { 
     "name": "DepartmentCode" 
     }, 
     "value": { 
     "integerValue": "123" 
     } 
     } 
    }, 
    { 
     "propertyFilter": { 
     "operator": "greaterThan", 
     "property": { 
     "name": "HourlyRate" 
     }, 
     "value": { 
     "doubleValue": 50 
     } 
     } 
    }, 
    { 
     "propertyFilter": { 
     "operator": "lessThan", 
     "property": { 
     "name": "HourlyRate" 
     }, 
     "value": { 
     "doubleValue": 100 
     } 
     } 
    } 
    ] 
    } 
    } 
} 
} 

z następującą odpowiedź: "Nr Index dopasowania znalezionego"

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "FAILED_PRECONDITION", 
    "message": "no matching index found.", 
    "locationType": "header", 
    "location": "If-Match" 
    } 
    ], 
    "code": 412, 
    "message": "no matching index found." 
} 
} 

Odpowiedz

2

Błąd wskazuje, że indeks musi zostać dodany, aby zapytanie zadziałało. Zobacz auto index generation documentation.

W tym przypadku potrzebny jest indeks z właściwościami KodDodatki i Godzinny (w tej kolejności).

+0

Dzięki Alfred! Zobacz moją aktualizację pytania. Niestety używam interfejsu API JSON i nie używam SDK App Engine (co pozwoliłoby mi w łatwy sposób dołączyć plik def do indeksu). –

6

JSON API nie obsługuje jeszcze generowanie indeksu lokalnego, ale my udokumentowana proces, który można wykonać, aby wygenerować definicję xml indeksu na https://developers.google.com/datastore/docs/tools/indexconfig#Datastore_Manual_index_configuration

Proszę podać ten strzał i daj nam znać, jeśli to nie działa.

Jest to rozwiązanie tymczasowe, które mamy nadzieję zastąpić automatycznym generowaniem lokalnych indeksów tak szybko, jak to możliwe.

+0

Max - dziękuję, widziałem to. Nie mam problemu z generowaniem pliku definicji indeksu XML. Pytanie brzmi - jak przesłać je na serwer? Nie mam aplikacji Java lub Python App Engine ... –

+0

Kolejna sekcja tego dokumentu odnosi się do narzędzia wiersza poleceń GCD, które wygląda tak, jakbym mógł zaktualizować indeksy na serwerze. Gdzie mogę znaleźć to narzędzie? –

+0

@ codeprose-sam zobacz https://developers.google.com/datastore/docs/tools/indexconfig#Updating_Indexs o tym, jak uruchomić gcd, aby zaktualizować indeks. Możesz go pobrać stąd: https://developers.google.com/datastore/docs/downloads#tools – proppy

1

Dla gcloud-node Naprawiłem go z tych 3 linków:

i najważniejsze ogniwo:

Jak wyjaśniono w ostatnim łączu, indeks umożliwia szybkie wykonywanie złożonych zapytań przez przechowywanie zestawu wyników zapytań w indeksie. Po uzyskaniu no matching index found oznacza to, że próbowano uruchomić złożone zapytanie obejmujące order lub filter.Aby zapytanie zadziałało, musisz utworzyć indeks w indeksach google datastore, tworząc ręcznie plik konfiguracyjny, aby zdefiniować indeksy reprezentujące kwerendę, którą próbujesz uruchomić. Oto jak to naprawić:

  1. utworzyć plik w folderze o nazwie na przykład indexes w katalogu app index.yaml wykonując wskazówki dla pliku python conf: https://cloud.google.com/appengine/docs/python/config/indexconfig#Python_About_index_yaml lub czerpać inspirację z testów gcloud-node w https://github.com/GoogleCloudPlatform/gcloud-node/blob/master/system-test/data/index.yaml
  2. tworzyć indeksy z pliku konfiguracyjnego z tym poleceniem: gcloud preview datastore create-indexes indexes/index.yaml zobaczyć https://cloud.google.com/sdk/gcloud/reference/preview/datastore/create-indexes
  3. czekać na indeksach służyć na konsoli programisty w Cloud Datastore/indeksów, interfejs powinien wyświetlać „służący”, gdy indeks jest zbudowany
  4. raz to służy zapytanie powinno działać

na przykład do tego zapytania:

var q = ds.createQuery('project') 
    .filter('tags =', category) 
    .order('-date'); 

index.yaml wygląda następująco:

indexes: 

- kind: project 
    ancestor: no 
    properties: 
    - name: tags 
    - name: date 
    direction: desc 
Powiązane problemy