Поиск с помощью Geocoder и Sunspot?

Я использую Geocoder и Sunspot в моем приложении, и у меня есть поле с именем :search_near_address, которое должно дать пользователям возможность вводить адрес, который они хотят найти рядом с X amount of miles . Я пытаюсь сопоставить мои магазины :address для использования в поле :search_near_address. Таким образом, пользователи могут ввести адрес (например, 451 University Avenue, Palo Alto, CA) в поле :search_near_address, и он будет искать в радиусе 50 миль.

Отвечать

Солнечное пятно 1.2.1


class Store < ActiveRecord::Base
   attr_accessible :address, :latitude, :longitude
   has_many :products
   geocoded_by :address
   after_validation :geocode
   reverse_geocoded_by :latitude, :longitude
   after_validation :reverse_geocode      
end

class Product < ActiveRecord::Base
   belongs_to :store

   searchable do # Searching with product model.
     string :search_near # For rake sunspot:reindex
     location :location
   end

   def search_near_address
 store.address if store # You may have to use the "if store".
   end

   def location
    # may need the "if store" after longitude)....
Sunspot::Util::Coordinates.new(store.latitude, store.longitude)
   end
end

class SearchController < ApplicationController

  def index
    @search = Product.search do |q| # Search with sunspot
      q.fulltext params[:search]
      q.with(:location).near(*Geocoder.coordinates(params[:search_near_address]), :precision => 4) if params[:search_near_address].present?
    end 
    @products = @search.results # Return results from Product.search block.
  end
end

# search/index/html.erb
<%= form_tag results_search_index_path, :method => 'get' do %>
    <%= text_field_tag :search, params[:search] %>
    <%= text_field_tag :search_near_address, params[:search_near_address] %>
    <%= submit_tag "Go", :name => nil %>
<% end %>


person LearningRoR    schedule 12.12.2011    source источник
comment
не знаю ни одного из этих драгоценных камней, но кажется очевидным, что метод near (предоставленный геокодером) не возвращает тот же объект, что и поиск с солнечным пятном (отсюда и undefined method 'results'). я бы попытался интегрировать near с dsl sunspot.   -  person m_x    schedule 12.12.2011


Ответы (2)


Во-первых, то, что @m_x сказал правильно, вы не можете ожидать, что присвоение результатов Store#near объекту @search будет работать....

Просто прочитав документацию по геопространственной информации на https://github.com/sunspot/sunspot, вы ясно увидите что вам не хватает нескольких вещей:

Вы должны объявить свое поле Geospatial, используя поля широты и долготы, которые требуются для геокодера:

class Product < ActiveRecord::Base
   belongs_to :store

   searchable do # for Sunspot search.
     string :search_near
     latlon(:location) { 
       Sunspot::Util::Coordinates.new(category.latitude, category.longitude)
     }
   end

   def search_near
     #I changed this because business_store will not work out.
     store.address
   end
end

Затем вы можете искать (после того, как что-то проиндексировали) следующим образом:

class SearchController < ApplicationController

  def index
    # Search with sunspot
    @search = Sunspot.search(Product) do
      fulltext params[:search]

      # The "*" pop off the elements of the array that 
      # Geocoder.coordinates returns.
      with(:location).near(*Geocoder.coordinates(params[:search_near]), 
                           :precision => 6)

      # NOTE: You could also use the in_radius method but only in the pre-release version:
      # with(:location).in_radius(*Geocoder.coordinates(params[:search_near]), 100) if params[:search_near].present?
    end

    # Return results from Product.search block.
    @products = @search.results 
  end
end

Также читайте об опции :precision здесь http://sunspot.github.com/docs/Sunspot/DSL/RestrictionWithNear.html#near-instance_method

О геокодере https://github.com/alexreisner/geocoder

person brutuscat    schedule 17.12.2011
comment
Я вижу, у них есть предварительная версия Sunspot 2.0. Хотя сейчас я использую Sunspot 1.2.1, поэтому in_radius — это неопределенный метод. Мне также пришлось изменить код для работы с моим 1.2.1, вот что у меня есть: gist.github. com/1494350. Как бы я поступил с этой версией? - person LearningRoR; 19.12.2011
comment
Вот еще немного документации sunspot.github.com/docs/Sunspot/DSL/RestrictionWithNear .html. Использование near вызывает еще одну ошибку: can't convert Symbol into Integer. Спасибо за помощь. - person LearningRoR; 19.12.2011
comment
Я изменил код, чтобы использовать метод close вместо in_radius и блок поиска, чтобы отразить то, что показано в документах (попробуйте скопировать мой и посмотрите;)). Я не могу сказать, почему у вас возникают эти ошибки с символами... В любом случае, кажется, что у вас проблемы с рубином, вы думали о том, чтобы получить книгу об этом языке? - person brutuscat; 19.12.2011

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

Это еще не проверено, но это мое текущее мышление....

Event.search do
      keywords  search_terms
      any_of do
        with(:id).any_of(Event.near(coordinates,50).map(&:id))
      end
end.results

По сути, я пытаюсь объединить два набора результатов, чтобы вернуть только те результаты, которые соответствуют как терминам расстояния, так и ключевым словам.

Надеюсь, это поможет хоть кому-то.

person Paul Carey    schedule 14.12.2011