Search code examples
sunspotsunspot-rails

How to do an OR query with rails sunspot for rsolr


I'm having trouble finding an example of how to do an OR query with sunspot. Here's my code.

class JobSearch < ActiveRecord::Base
  monetize :salary, as: 'salary', allow_nil: true
  DEFAULT_DISTANCE_IN_MILES = 50

  def search(page, page_size)
    latitude, longitude = LatitudeLongitudeLookup.latitude_longitude_from_string(location) if location.present?
    Job.search(include: [:state]) do
      facet(:minimum_compensation_cents) do
        row(150000..Float::INFINITY) do
          with(:minimum_compensation_cents).greater_than(150000)
        end
        row(100000..149999) do
          with(:minimum_compensation_cents, 100000..149999)
        end
        row(50000..99999) do
          with(:minimum_compensation_cents, 50000..99999)
        end
        row(25000..49999) do
          with(:minimum_compensation_cents, 25000..49999)
        end
      end

      facet :titles, limit: 5
      facet :city_state, limit: 5
      facet :job_type
      facet :work_remotely

      if !include_remote
        with(:location).in_radius(latitude, longitude, DEFAULT_DISTANCE_IN_MILES, bbox: true) if latitude && longitude
      else #need to do a location with an OR include_remote
        with(:location).in_radius(latitude, longitude, DEFAULT_DISTANCE_IN_MILES, bbox: true) if latitude && longitude
        #OR - how to do that?
        with(:work_remotely, true)
      end

      with(:city_state, location) if location.present? && (!latitude && !longitude)
      order_by_geodist(:location, latitude, longitude) if latitude && longitude
      with(:job_type, job_type) if job_type.present?
      with(:titles, position_title) if position_title.present?

      if !latitude && !longitude && !include_remote 
        with(:work_remotely, include_remote)
      end

      fulltext keyword
      paginate page: page, per_page: page_size
    end
  end
end

What I need to do is is directly under the facet section if they have searched on a location and also indicated to include remote jobs, the query should be something like "where location=locationsearchtext OR work_remotely=true". So, how do you construct that with sunspot? Thanks.


Solution

  • This is what you need to do:

    facet :work_remotely
    
          if !include_remote
            with(:location).in_radius(latitude, longitude, DEFAULT_DISTANCE_IN_MILES, bbox: true) if latitude && longitude
          else #need to do a location with an OR include_remote
            any_of do
              with(:location).in_radius(latitude, longitude, DEFAULT_DISTANCE_IN_MILES, bbox: true) if latitude && longitude
              with(:work_remotely, true)
            end
          end
    

    You can find out more information on the sunspot wiki: https://github.com/sunspot/sunspot/wiki/Scoping-by-attribute-fields#disjunctions-and-conjunctions