思考狮身人面像 - 显示协会的正确记录

时间:2011-05-29 22:31:53

标签: ruby-on-rails google-maps geolocation thinking-sphinx

我成功地让思考Sphinx在相关模型上使用Geolocation。快乐的日子!

但我现在需要它在Google地图上显示正确的关联记录。

该方案是一家拥有has_many办事处的公司。办公室已获得lng,lat值。我正在寻找公司并将办公室与之联系起来。

E.g。

  define_index do

 indexes :name, :sortable => true
 indexes offices(:city), :as => :city
 indexes offices(:postal_code), :as => :postal_code

 has "RADIANS(offices.lat)", :as => :lat,  :type => :float
 has "RADIANS(offices.lng)", :as => :lng,  :type => :float

 has created_at
 has updated_at

 set_property :latitude_attr  => 'lat'
 set_property :longitude_attr => 'lng'
 set_property :field_weights  => { 'name'        => 10,
                                  'service_name' => 9,
                                  'city'    => 8 }

 end

在y位置搜索x公司/邮政编码工作正常,显示在@geodist半径内所需位置设有办公室的正确公司。

E.g。

{:geo=>[0.9283660690549609, -0.050527407508941975], :sort_mode=>:expr, :sort_by=>"@weight * @weight / @geodist", :with=>{"@geodist"=>0.0..120700.8}, :conditions=>{:service_name=>"Business strategies"}, :page=>1, :per_page=>12, :star=>true}

结果记录是公司对象,而不是办公室,这对列表视图来说很好,但我想在相关联的办公室的谷歌地图上显示图标。

找到在半径范围内显示的相关相关办公室记录的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

Sphinx只能可靠地处理单值浮点属性 - 它没有成对的lat / lng值的概念。这意味着您无法在具有多个lat / lng对的对象之间进行可靠搜索。

最好的解决方法是实际在Office上搜索 - 也许可以获取每个办公室的公司信息:

define_index do
  indexes company.name, :as => :name, :sortable => true
  indexes city, postal_code

  has "RADIANS(offices.lat)", :as => :lat,  :type => :float
  has "RADIANS(offices.lng)", :as => :lng,  :type => :float
  has company.created_at, :as => :created_at
  has company.updated_at, :as => :updated_at
  has company_id

  set_property :field_weights  => {
    'name'         => 10,
    'service_name' => 9,
    'city'         => 8
  }
end

然后在搜索时,您可以按company_id进行分组,以确保任何公司只有一个结果(如果这是您更喜欢的):

Office.search 'foo',
  :geo            => [lat, lng],
  :with           => {'@geodist' => 0.0..120700.8}
  :group_function => :attr
  :group_by       => 'company_id'

如果对于给定的company_id返回哪个Office很重要,那么您可能也想要使用:group_clause选项。文档cover this