Google App Engine — PHP-GDS Сортировка запросов из AppEngine DataStore

Я создал индекс, используя схему, используя удивительный PHP-GDS:

$obj_product_schema = (new Schema('Product'))
->addString('url')
->addString('date')
->addString('name', TRUE)
->addInteger('votes', TRUE);

Однако, если я пытаюсь вернуть подмножество объектов с отсортированным запросом следующим образом, я получаю сообщение об ошибке «Не найден соответствующий индекс».

$queryStr = "SELECT * FROM Product WHERE date='" . $dateQ . '" ORDER BY votes ASC ";
$obj_event_store->query($queryStr);
$products = $obj_event_store->fetchPage(5);

Ошибка:

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/datastore/v1beta2/datasets/app/runQuery: (412) no matching index found.'

1

Решение

Когда вы указали «true» для вашего параметра, он создал индекс для этого единственного параметра. Я думаю, что путаница была между индексами с одним параметром и составными индексами (я только что видел ваш другой вопрос ответил Том).

Хотя эти индексы с одним параметром действительно работают для запросов с одним параметром (SELECT * FROM X WHERE Y = whateverгде требуется только индекс для Y), когда вы добавляете заказ на другой параметр, ему нужен составной индекс (SELECT * FROM X WHERE Y = whatever ORDER BY Zгде это нужно Y и Z). Вы не можете объявить их в своей схеме напрямую, они должны быть загружены с вашим приложением (в файле с именем index.yaml).

Подумайте об этом так: ваше хранилище данных в настоящее время имеет индекс, где только информация, доступная для этого, является датой и ключом объекта. У этого также есть другой индекс, где только Информация доступна голосование и ключ объекта. Как бы он узнал, что нужно вернуть, если вы попросите дату при голосовании? Вот почему вам нужно добавить индекс, где доступной информацией является дата а также голос, с ключом объекта, так что ваше хранилище данных может искать в этой таблице

В качестве примечания: система стала лучше, чем была раньше: теперь она может использовать алгоритм слияния ZigZag для создания более сложных индексов из более простых (хотя все еще существуют ограничения, связанные с этим, и, очевидно, это влияет на производительность).

Больше информации в связанный ответ

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]