Sunspot Пространственный поиск не возвращает результаты
Я только что внедрил гем Sunspot в свое приложение, и он мне действительно нравится, за исключением того факта, что когда я выполняю поиск по местоположению, кажется, что он исключает некоторые результаты. Например: я живу в Колумбусе, штат Огайо, поэтому, если я ищу "Колумбус, штат Огайо", мое приложение переводит это в лат / лнг, и я делаю:
@search = (Skatepark.search {
with(:coordinates).near lat, lng, :precision => 3
fulltext text
paginate :page => params[:page], :per_page => 15
})
Это возвращает некоторые записи, которые геокодированы на западной стороне Колумба, но нет ни одной из моих записей, которые у меня есть в моей базе данных, которые находятся на восточной стороне. Я делаю что-то не так с моим поиском?
Вы можете попробовать это сами на http://skateparks.co/search
Если вы ищете "Колумбус Огайо", вы получите совершенно другие результаты, чем если бы вы искали "Ланкастер Огайо", который находится всего в нескольких милях к юго-востоку.
1 ответ
Это потому, что Sunspot зависит от гема pr_geohash, который генерирует геопространственный индекс.
Геохэш - это форма кривой z-порядка.
Вы пытаетесь решить проблему ближайшего соседа, используя этот индекс, который по своей природе может давать только приблизительные результаты. Автор выбрал бы этот подход, поскольку Solr предназначен для работы с большими наборами данных, которые страдают от проклятия размерности.
В зависимости от ваших требований, возможно, вам стоит попробовать
- раствор без силоса, например. Freebase (есть несколько драгоценных камней)
- решение Saas
- пространственная база данных,
- база геоданных,
- или твой собственный подход?
Предложенное решение
Используйте геоджоновские объекты для городов, поселков и деревень, а не простые широты и долготы. Используйте семантическое автозаполнение, чтобы пользователи могли выбирать полигон непосредственно из Freebase. (Пример интерфейса: окно поиска Quora). Таким образом, все результаты в запрошенном городе будут возвращены, так как теперь вы выполняете поиск с полигональными ограничениями, а не радиальный поиск.
Я призываю вас сделать ваши данные доступными в качестве местоположений в Freebase, где их родителем является город / поселок / деревня, если это вообще возможно с учетом вашей бизнес-модели. Оказывается, есть и тип местоположения, и тема местоположения, все готово для вас.
Обновление 1
Я замечаю, что ты на Heroku.
Если у вас есть выделенная база данных, вы можете использовать PostGIS.
Если нет, прочитайте Как вы выполняете ГИС-запросы на Heroku, используя общую базу данных?