Rails 3太阳黑子搜索范围内的搜索

时间:2011-03-08 22:42:22

标签: ruby-on-rails ruby-on-rails-3 solr ruby-on-rails-plugins sunspot

关于新的太阳黑子/ solr功能,我有一个问题要问:restriction with near 我(通过谷歌地理编码API)视口和边界是边界框的西南角和东北角的纬度/经度坐标。我希望Sunspot / Solr在这个边界框内搜索,但我还没想出来。所以我的问题是: 是否有可能使Solr(或通过任何solr插件)能够在边界框内进行搜索?如果是,怎么做?

谢谢

2 个答案:

答案 0 :(得分:3)

您可以创建一个类型为trie double的latlng字段,然后执行两个范围查询(一个用于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

答案 1 :(得分:3)

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

从3.1开始,solr中的Sparcial是added,我在太阳黑子中找不到相应的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>
相关问题