用思维狮身人面像进行地理搜索

时间:2011-12-07 07:12:25

标签: ruby-on-rails-3 search sphinx thinking-sphinx

如何使用思维狮身人面像将多个参数传递到搜索中?或者,如何使用思维狮身人面像创建高级搜索字段?

背景:我正在创建一个网站,允许制造商发布他们需要在全国范围内运输的货物。运营商需要能够根据他们当前的位置搜索已发布的负载,并返回最有利可图的负载列表,然后他们可以出价。运营商将拥有两个输入,即他们当前的位置以及他们愿意前往负载的半径。思考Sphinx似乎能够处理所有这些问题,但是文档没有详细介绍复杂的搜索查询。

我有一个名为Load的模型,它具有以下属性及其各自的类型:

# :latitude => float
# :longitude => float
# :delivery_date => date
# :delivery_latitude => float
# :delivery_longitude => float
# :weight => integer
# :truck_type => string
# :price => decimal
# :distance => float
# :delta => boolean

我在模型中包含了如下索引:

define_index do
 indexes :commodity
 indexes :truck_type
 set_property :delta => true
 has weight, distance      
 has "Radians(latitude)", :as => :latitude, :type => :float
 has "Radians(longitude)", :as => :longitude, :type => :float
end

我还在我的lib文件夹中定义了一个搜索类,它使用ruby geocoder gem来满足我的所有地理编码需求。此代码尚未经过测试,因此我不确定其正确性,但我将其包含在内,以确定我的思维过程是否正确。

class Search 

  #Inputs for the search will be a current_location string, and a distance integer (miles)

  # Variable needed to convert to imperial values
  METERS_PER_MILE = 1609.344 

  # Expression used to rank the loads
  SORT_EXPRESSION = "Sorting function tbd, combination of weight, distance, and price"

def self.execute(keyword, var = {}) 
  @search_options = { :page => var[:page] || 1, 
                    :per_page => Load::PER_PAGE }

  unless (keyword).blank? #I am unsure if this is correct
  @geocode = Geocoder.coordinates(keyword) #returns an array ex.[keyword_latitude, keyword_longitude]


    if @geocode.success and @geocode.accuracy > 1 
    lat = (@geocode.first / 180.0) * Math::PI 
    lng = (@geocode.last / 180.0) * Math::PI 

    @search_options.merge!(:geo => [lat, lng], 
                           :sort_mode => :expr, 
                           :sort_by => SORT_EXPRESSION, 
                           :with => { "@geodist" => 0.0..(travel_distance * METERS_PER_MILE) }) 
    end 
  end
 Load.search(keyword, travel_distance, @search_options)
end

目标是能够进入任何控制器并定义实例变量并调用此搜索模块以返回值。 (@loads = Search.execute(params [:search])我也不知道如何显示搜索结果

是否有人必须使用可以共享其设置的思维狮身人面像来运行类似的地理搜索?我也需要运行延迟的增量,但文档在该主题上更清晰。

2 个答案:

答案 0 :(得分:1)

这里有很多东西可以理解,但是如果我理解这一点,那么一切都归结为搜索调用,你想要在距地理点一定距离内加载,对吗?如果是这样,那么只需从您的搜索请求中删除travel_distance作为第二个参数,它应该没问题:

Load.search keyword,
  :geo       => [lat, lng], 
  :sort_mode => :expr, 
  :sort_by   => SORT_EXPRESSION, 
  :with      => { "@geodist" => 0.0..(travel_distance * METERS_PER_MILE) }

但鉴于我所建议的与你已经得到的完全不同,我想知道我是否正确理解了这个问题......

答案 1 :(得分:0)

您可以使用geocoder宝石,而不是尝试重新发明轮子和Finagle Sphinx来做您想做的事情,而不是让您的货运/上市模型位置感知。这将在您的数据库中存储货运清单的纬度/经度,并为您的模型添加地理位置查询方法。这允许您在指定距离内找到惊吓列表,如下所示:

@results = FreightListing.near('77033', 50) # Finds all listings that are within 50 miles of the zip code 77033

此处有更多信息:http://www.rubygeocoder.com/