Я создал индекс, используя схему, используя удивительный 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.'
Когда вы указали «true» для вашего параметра, он создал индекс для этого единственного параметра. Я думаю, что путаница была между индексами с одним параметром и составными индексами (я только что видел ваш другой вопрос ответил Том).
Хотя эти индексы с одним параметром действительно работают для запросов с одним параметром (SELECT * FROM X WHERE Y = whatever
где требуется только индекс для Y), когда вы добавляете заказ на другой параметр, ему нужен составной индекс (SELECT * FROM X WHERE Y = whatever ORDER BY Z
где это нужно Y и Z). Вы не можете объявить их в своей схеме напрямую, они должны быть загружены с вашим приложением (в файле с именем index.yaml
).
Подумайте об этом так: ваше хранилище данных в настоящее время имеет индекс, где только информация, доступная для этого, является датой и ключом объекта. У этого также есть другой индекс, где только Информация доступна голосование и ключ объекта. Как бы он узнал, что нужно вернуть, если вы попросите дату при голосовании? Вот почему вам нужно добавить индекс, где доступной информацией является дата а также голос, с ключом объекта, так что ваше хранилище данных может искать в этой таблице
В качестве примечания: система стала лучше, чем была раньше: теперь она может использовать алгоритм слияния ZigZag для создания более сложных индексов из более простых (хотя все еще существуют ограничения, связанные с этим, и, очевидно, это влияет на производительность).
Больше информации в связанный ответ
Других решений пока нет …