思考Sphinx geodist搜索返回不同城市的位置

时间:2012-07-20 19:22:16

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

我有思考Sphinx在全美各地的索引位置,我需要找到最接近某个纬度/经度的位置。在最简单的示例中,我使用特定城市的lat / lon(从Google Maps API中提取lat / lon)并进行搜索,首先按最近的位置排序。

问题是,当我在纽约市搜索位置时,它给了我在德克萨斯州奥斯汀的结果。当我在奥斯汀寻找位置时,我得到了宾夕法尼亚州的泽西海岸。每个城市搜索都会给我一个完全不同的城市的结果。我甚至不确定从哪里开始这样的问题。

这是我的索引定义。 (该位置具有关联的城市对象,也具有纬度/经度,因此是location.latitude)

位置:

思考狮身人面像

define_index do
    indexes :name
    indexes :description
    indexes city.name, :as => :city_name

    has "RADIANS(locations.latitude)",  :as => :latitude,  :type => :float
    has "RADIANS(locations.longitude)", :as => :longitude, :type => :float

    set_property :latitude_attr => :latitude, :longitude_attr => :longitude

    # set_property :delta => true
end

###############################################################

没有设置latitude_attr属性,我一直收到错误:

Sphinx Daemon returned error: index location_core: unknown latitude attribute 'latitude'

搜索命令: Location.search(:geo => [city.latitude, city.longitude], :order => "@geodist ASC, @relevance DESC", :per_page => 5)

为了让我朝着正确的方向前进,可以提供任何帮助。

1 个答案:

答案 0 :(得分:0)

"RADIANS(locations.latitude)"转换为您可能在数据库中使用的度数,因此您还必须将:geo => [city.latitude, city.longitude]转换为Radians。 即。

:geo => Geocoder::Calculations.to_radians([city.latitude, city.longitude])

所以我认为它的“工作”因为两者现在都是度数或者你的数据库字段无论如何都是Radians并且不需要转换。但是文档说:

  

但请记住,Sphinx需要这些值是浮点数,而且   以弧度而非度数跟踪位置。如果这不是   在你自己的数据库中的情况(这并不奇怪 - 大多数人存储   值为度),那么你需要手动转换列   对于属性:

http://pat.github.com/ts/en/geosearching.html