Geohashing vs SearchAPI для геопространственных запросов с использованием хранилища данных

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

  • Индексирование геохешированных данных геоточки с использованием библиотеки Python GeoModel
  • Создание/удаление документов со структурированными данными с использованием нового Google SearchAPI

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

  • Кто-нибудь реализовывал аналогичные функции и имел положительный опыт использования любого из методов?
  • Какой метод будет более дешевой альтернативой?
  • Что было бы более быстрой альтернативой?
  • Есть ли еще один важный метод, который я упускаю?

Заранее спасибо.




Ответы (2)


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

Если ваш вариант использования заключается в поиске других объектов в радиусе, как вы предлагаете, я определенно рекомендую использовать API поиска. У них есть функция расстояния, адаптированная для этого использования.

Запросы API поиска дороже, чем запросы к хранилищу данных, да, но если вы взвесите время вычислений, необходимое для выполнения этих вычислений в вашем экземпляре, и, возможно, перебираете все объекты для каждого геохэша, чтобы убедиться, что расстояние на самом деле меньше желаемого радиуса, тогда я сказал бы, что Search API является победителем. И не забывайте о времени реализации.

person marcus    schedule 20.03.2016
comment
Вы говорите, что API поиска не использует никаких экземпляров, если вы находитесь в стандартной среде движка приложений Google? - person Micro; 28.12.2016
comment
API поиска — это служба, предоставляемая платформой Google. Он не запускается внутри вашего инстанса — вы отправляете вызов и ждете ответа от сервиса. У вас должен быть запущен экземпляр, чтобы иметь доступ к API поиска, но сам поиск в вашем экземпляре не выполняется. Однако вы будете использовать поток в своем экземпляре, ожидая ответа. Если бы вы выполняли вычисления в своем экземпляре, вы могли бы захотеть использовать несколько потоков и/или более дорогой процессор для своего экземпляра. Если вы просто передаете данные, вы можете вместо этого иметь гораздо более дешевый экземпляр с частотой 500 МГц. - person marcus; 05.01.2017

Вы можете взглянуть на этот сообщение, это может быть еще одним замечательным альтернатива.

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

person rahulfhp    schedule 19.03.2016