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]されるため、ラジアンにも変換する必要があります。すなわち

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

したがって、両方が度であるか、データベースフィールドがとにかくラジアンであり、変換が必要なかったため、「機能している」と思います。しかし、ドキュメントは言っています:

ただし、Sphinx ではこれらの値が float である必要があり、位置を度ではなくラジアンで追跡する必要があることに注意してください。これが独自のデータベースに当てはまらない場合 (驚くことではありません。ほとんどの人は値を度として保存します)、属性の列を手動で変換する必要があります。

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

于 2012-11-18T14:52:46.190 に答える