我有思考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)
为了让我朝着正确的方向前进,可以提供任何帮助。
答案 0 :(得分:0)
"RADIANS(locations.latitude)"
转换为您可能在数据库中使用的度数,因此您还必须将:geo => [city.latitude, city.longitude]
转换为Radians。
即。
:geo => Geocoder::Calculations.to_radians([city.latitude, city.longitude])
所以我认为它的“工作”因为两者现在都是度数或者你的数据库字段无论如何都是Radians并且不需要转换。但是文档说:
但请记住,Sphinx需要这些值是浮点数,而且 以弧度而非度数跟踪位置。如果这不是 在你自己的数据库中的情况(这并不奇怪 - 大多数人存储 值为度),那么你需要手动转换列 对于属性: