2015-10-30 5 views
1

Я пытаюсь использовать хранилище google для моего приложения без GAE.Ошибка индексации при поиске в Google Datastore с использованием gcloud

Для этого я создал виды и связанные с предком сущности в хранилище данных, используя библиотеку python gcloud.

Также обновлена ​​конфигурация индекса данных хранилища для всех видов с использованием gcd-инструмента через файл WEB-INF/datastore-indexes.xml и его статус.

Однако я не могу успешно запросить столбцы, основанные на индексе, либо на консоли, либо с помощью gcloud lib.

Вот запрос & отслеживающий

from gcloud import datastore 

ds = datastore.Client(dataset_id='XXXXXX') 
query = datastore.Query(ds, kind='event') 
query.add_filter('EvtName', '=', 'buy') 
query.add_filter('EventDateTime', '<=', datetime.datetime(2015, 10, 22, 8, 45)) 
for itm in query.fetch(): 
    print(dict(itm)) 


gcloud.exceptions.PreconditionFailed: 412 no matching index found. 

вот мой хранилищу-indexes.xml конфигурации

<?xml version="1.0" encoding="utf-8"?> 

<datastore-indexes 
    autoGenerate="false"> 
    <datastore-index kind="event" ancestor="true"> 
     <property name="EvtName" direction="desc" /> 
     <property name="EventDateTime" direction="desc" /> 
    </datastore-index> 
    <datastore-index kind="att" ancestor="true"> 
     <property name="EvtAttName" direction="desc" /> 
     <property name="EventDateTime" direction="desc" /> 
    </datastore-index> 
    <datastore-index kind="att_val" ancestor="true"> 
     <property name="AttValue" direction="desc" /> 
     <property name="EventDateTime" direction="desc" /> 
    </datastore-index> 
    <datastore-index kind="user" ancestor="true"> 
     <property name="EventDateTime" direction="desc" /> 
    </datastore-index> 
</datastore-indexes> 

я упускаю что-то?

+1

Можете ли вы поделиться запросами, которые вы пытаетесь выполнить? Datastore требует определенных индексов для каждого запроса. –

+0

@PatrickCostello, я обновил свой вопрос с запросом. Пожалуйста, проверьте – shivg

ответ

2

Все ваши индексы предназначены для использования с запросами предков (обратите внимание на ancestor=true). Однако ваш фактический запрос не запрашивает у определенного предка.

Для того, чтобы ответить на ваш конкретный запрос, необходимо индекс:

<datastore-index kind="event" ancestor="false"> 
    <property name="EvtName" direction="desc" /> 
    <property name="EventDateTime" direction="desc" /> 
</datastore-index> 

Или, если вы на самом деле хотите запросить лиц с конкретным родителем, убедитесь, чтобы добавить предок фильтр с Query#hasAncestor(Key parentKey).

+1

Чтобы быть в безопасности, я всегда стараюсь запускать все свои запросы на devserver, чтобы он мог генерировать сами индексы. – Patrice

+0

неправильно поняли точку «конкретные индексы для каждого запроса». Мне нужен был и запрос с предком и без предка. Создание отдельных индексов для одного и того же типа решает мою проблему :) – shivg

Смежные вопросы