Как наилучшим образом разработать запрос даты / географической близости в GAE? - PullRequest
1 голос
/ 26 марта 2010

Я создаю каталог для поиска спортивных турниров по GAE с web2py и внешний интерфейс Flex. Пользователь выбирает местоположение, радиус и максимум дата из набора вариантов. У меня есть базовая версия этого запроса, но это неэффективно и медленно. Один способ, которым я знаю, что могу улучшить это, конденсируя много отдельных запросов, которые я использую, чтобы собрать объекты в массовые запросы. Я только что узнал, что это возможно. Но я также думаю о более обширном редизайне, использующем memcache.

Основная проблема в том, что я не могу запросить хранилище данных по местоположению потому что GAE не позволяет несколько операторов числового сравнения (<, <=,> =,>) в одном запросе. Я уже использую один для даты, и мне нужно ДВА, чтобы проверить широту и долготу, так что не стоит. В настоящее время, мой алгоритм выглядит так:

1.) Запросите по дате и выберите

2.) Используйте функцию назначения из модуля расстояния geopy, чтобы найти максимальная и минимальная широта и долгота для заданного расстояния

3.) Просмотрите результаты и удалите все с широтой / долготой за пределами макс / мин.

4.) Переберите снова и используйте функцию расстояния, чтобы проверить точное расстояние, потому что шаг 2 будет включать в себя некоторые области за пределами радиуса. Удалить результаты за пределами предоставленного расстояния (это комбинация 2/3/4 inefficent?)

5.) Соберите списки «многие ко многим» и прикрепите к объектам (это где я нужно перейти на массовые операции)

6.) Возврат к клиенту

Вот мой план использования memcache .. дайте мне знать, если я ухожу влево поле на этом, так как у меня нет опыта работы с memcache или сервером кеширование вообще.

-Сохранить список в кеше, заполненном «геообъектами», которые представляют все мои данные. У них есть пять свойств: широта, долгота, event_id, event_type (в ожидании выхода за пределы турниров) и Дата начала. Этот список будет отсортирован по дате.

-Также держите указатели в кеше, которые представляют начало и конец индексов в кеше для всех диапазонов дат, используемых моим приложением (далее неделя, 2 недели, месяц, 3 месяца, 6 месяцев, год, 2 года).

-Имеет запланированное задание, которое обновляет указатели ежедневно в 12 часов утра.

-Добавить новые вставки в кеш, а также в хранилище данных; Обновить указатели.

Используя этот дизайн, алгоритм теперь будет выглядеть так:

1.) Используйте указатели, чтобы вырезать соответствующий фрагмент списка на основе Дата поставки.

2-4.) Тот же алгоритм, что и выше, за исключением геообъектов

5.) Используйте массовую операцию, чтобы выбрать полные турниры, используя оставшиеся гео event_ids объекта

6.) Соберите много-к-человеку

7.) Возврат к клиенту

Мысли об этом подходе? Большое спасибо за чтение и любые советы вам могу дать.

- датчанин

Ответы [ 2 ]

2 голосов
/ 29 марта 2010

GeoModel - лучшее, что я нашел. Вы можете посмотреть, как мое приложение GAE app возвращает геопространственные запросы. Например, запрос http в Индии с необязательным cc (кодом страны) с использованием библиотеки геомоделей lat=20.2095231&lon=79.560344&cc=IN

1 голос
/ 29 марта 2010

Вас может заинтересовать geohash, что позволяет выполнить запрос неравенства, подобный следующему:

ВЫБРАТЬ широту, долготу, название ОТ myMarkers WHERE geohash> =: sw_geohash И геохаш <=: ne_geohash </p>

Взгляните на эту прекрасную статью , которая была опубликована в этом месяце в Google App Engine Обновление сообщества App Engine сообщение в блоге.

В качестве примечания о предложенном вами проекте не забывайте, что сущности в Memcache не имеют гарантий того, что они останутся в памяти, и что вы не можете их "отсортировать по дате".

...