我成功地让思考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}
结果记录是公司对象,而不是办公室,这对列表视图来说很好,但我想在相关联的办公室的谷歌地图上显示图标。
找到在半径范围内显示的相关相关办公室记录的最佳方法是什么?
答案 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。