0

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

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

这是我的索引定义。(该位置有一个关联的城市对象,它也有一个纬度/经度,因此是 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)

感谢您提供任何帮助以使我朝着正确的方向前进。

4

1 回答 1

0

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

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

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

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

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

于 2012-11-18T14:52:46.190 回答