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 предназначен для работы с большими наборами данных, которые страдают от проклятия размерности.

В зависимости от ваших требований, возможно, вам стоит попробовать

  1. раствор без силоса, например. Freebase (есть несколько драгоценных камней)
  2. решение Saas
  3. пространственная база данных,
  4. база геоданных,
  5. или твой собственный подход?

Предложенное решение

Используйте геоджоновские объекты для городов, поселков и деревень, а не простые широты и долготы. Используйте семантическое автозаполнение, чтобы пользователи могли выбирать полигон непосредственно из Freebase. (Пример интерфейса: окно поиска Quora). Таким образом, все результаты в запрошенном городе будут возвращены, так как теперь вы выполняете поиск с полигональными ограничениями, а не радиальный поиск.

Я призываю вас сделать ваши данные доступными в качестве местоположений в Freebase, где их родителем является город / поселок / деревня, если это вообще возможно с учетом вашей бизнес-модели. Оказывается, есть и тип местоположения, и тема местоположения, все готово для вас.

Обновление 1

Я замечаю, что ты на Heroku.

Если у вас есть выделенная база данных, вы можете использовать PostGIS.

Если нет, прочитайте Как вы выполняете ГИС-запросы на Heroku, используя общую базу данных?

Другие вопросы по тегам