Платформа, похожая на Yelp, требует трёх основных подсистем: геопространственной индексации, управления контентом и поиска и ранжирования. Каждая должна масштабироваться независимо, чтобы справляться с высокими объёмами трафика.
Основа поиска по близости — это эффективный пространственный индекс. Я бы использовал Geohash для кодирования широты/долготы в иерархические строковые токены.
Точность Geohash:
- 6 символов (~1.2km ячейка) → поиск по окрестностям
- 5 символов (~5km ячейка) → поиск на уровне города
Бизнесы хранятся со своим geohash в распределённой базе данных вроде Cassandra или DynamoDB, разбитые по префиксу geohash. Для сложных запросов по полигонам структура Quadtree дополняет этот подход.
Результаты ранжируются с использованием комбинированного скора:
score = (α × relevance) + (β × rating) + (γ × 1/distance)
relevance — совпадение ключевых слов с названием бизнеса/категорией/тегамиrating — взвешенное среднее значение оценки из отзывов пользователейdistance — обратное значение расстояния от локации пользователяα, β, γ настраиваются в зависимости от контекста запросаТочность geohash в 6 символов обеспечивает разрешение ячейки примерно 1.2км, что делает это подходящим для поиска на уровне района в платформе на основе геолокации.
Новый — ещё не проверен сообществом
Вы