Rails 3 Sunspot Solr поиск в пределах - PullRequest
1 голос
/ 09 марта 2011

У меня есть вопрос к новой функции Sunspot / solr: ограничение с почти У меня есть (через API геокодирования Google) область просмотра и границы, которые являются координатами широты / долготы юго-западного и северо-восточного углов ограничительной рамки. Я хочу, чтобы Sunspot / Solr искали в этой ограничивающей рамке, но я еще не понял этого. Итак, мой вопрос: Возможно ли сделать Solr (или через любой из плагинов solr) способным к поиску внутри ограничительной рамки? Если да, то как?

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Sunspot поддерживает пространственный поиск с использованием Geohash, см. RestrictionWithNear . Но вы можете использовать только заранее определенное расстояние (хотя :precision).

# model
# lat: decimal
# lng: decimal
class Product < ActiveRecord::Base
  seachable do
    location :location do
      Sunspot::Util::Coordinates.new(lat, lng)
    end
  end
end

# search
Product.search do
  # near(lat, lng)
  with(:location).near(76.4556, 67.9987, :precision => 3)
end

Sparcial добавлено в solr начиная с 3.1, я не могу найти соответствующий DSL в солнечном пятне, но вы всегда можете использовать adjust_solr_params для добавления пользовательских параметров:

Product.search do
  adjust_solr_params do |params|
    parmas[:fq] << '{!geofilt pt=74.4556,67.9987 sfield=location d=5}'
  end
end

Вы должны использовать Solr 3.1 (связанное значение solr в солнечной точке - 1.4) и расположение индексного поля, например

class Product < ActiveRecord::Base
  searchable do
    string(:location, :as => :location) { [lat,lng].join(',') }
  end
end

Также необходимо добавить тип поля в schema.xml. (Например, я сам не пробовал)

<types>
  ...
  <fieldType name="geo" class="solr.LatLonType" omitNorms="true"/>
</types>
<fields>
  ...
  <field name="location" stored="false" termVectors="false" type="geo" multiValued="false" indexed="true"/>
</fields>
3 голосов
/ 09 марта 2011

Вы можете просто создать поля lat и lng типа trie double, а затем выполнить два запроса диапазона (один для диапазона lat, один для диапазона lng).

class Product < ActiveRecord::Base
  seachable do
     double :latitude
     double :longitude
  end
end

# search
Product.search do
  with :latitude, 36.5667..80.4553 
  with :longitude, 76.4556..67.9987
end
...