Datastore - выберите близлежащие сообщения, используя заданные координаты

Я использую хранилище данных App Engine с JDO для хранения данных обо всех сообщениях пользователей, а также широту и долготу того места, где они размещены.

Имея координаты текущего пользователя, я хочу получить соседние сообщения в пределах x километров текущего пользователя.

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

Согласно этому ответу в СУБД, это может быть достигнуто путем вычисления в самом запросе.

Как выполнить этот запрос в JDO? Есть ли лучший способ сохранить данные о местоположении, где их можно легко получить, вычислив расстояние?

2 ответа

1 - GAE-Search - отличное решение для высокопроизводительного геопространственного поиска в большом наборе данных. Вы даже можете объединить его с полнотекстовым поиском и сделать рейтинг вместе.

Недостатком является то, что вам придется дублировать данные индекса поиска в GAE-Search.

Лучший способ использовать его с хранилищем данных - использовать ключ хранилища данных в качестве идентификатора документа в индексе GAE-Search, где у вас есть взаимно однозначное сопоставление с объектом хранилища данных (и использовать тот же ключ в mem-кеше, что ndb/objectify и т.д. облегчать). Затем верните doc-идентификаторы из GAE-Search, чтобы получить его из memcache.

2 - CloudSQL - самый удобный способ. Он будет работать нормально, если вам нужен геопространственный поиск, так как условие и ранжирование или комбинация с полнотекстовым поиском не требуются. И если данные не будут расти настолько большими, что вы увидите проблемы с производительностью.


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

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

возможно, использование canSQL может помочь вам в этом? он поддерживает множественное неравенство и агрегацию

licensed under cc by-sa 3.0 with attribution.