0

渡された座標からの距離でソートして場所を検索する必要があります。

アプリ/インデックス/location_index.rb

ThinkingSphinx::Index.define :location, :with => :active_record do
  indexes :name
  has latitude, longitude
end

検索してみてください:

> Location.search(:geo => [53.348962, 83.777988], :order => "@geodist DESC").size
ThinkingSphinx::SyntaxError: sphinxql: syntax error, unexpected USERVAR, expecting IDENT (or 5 other tokens) near '@geodist DESC LIMIT 0, 20; SHOW META'

> Location.search(:geo => [53.348962, 83.777988],:with => {"@geodist" => 0.0..5000.0}, :order => "@geodist DESC").size
ThinkingSphinx::SphinxError: sphinxql: only >=, <=, and BETWEEN floating-point filter types are supported in this version near '@geodist BETWEEN 0.0 AND 5000.0 AND sphinx_deleted = 0 ORDER BY @geodist DESC LIMIT 0, 20; SHOW META'
  • Sphinx 2.0.6 リリース (r3473; 2012 年 10 月 22 日)
  • 思考スフィンクス (3.0.1)

アップデート:

Pat Allan の提案: Geodist は @ 記号を必要としなくなりました - 代わりに以下を試してください:

Location.search(:geo => [53.348962, 83.777988], :order => "geodist DESC").size
Location.search(:geo => [53.348962, 83.777988],:with => {:geodist => 0.0..5000.0}, :order => "geodist DESC").size
4

1 に答える 1

1

人々がこの質問を見つけた場合に備えて、正しい形式でもう少し説明を加えて回答を追加すると思いました。

2.1.1 より前のバージョンの Sphinx では、計算された距離が @geodist 内部変数を介して利用可能になりました。新しいバージョンの Sphinx と互換性のあるバージョンの Thinking Sphinx では、GEODIST() の値は geodist にエイリアスされています。

したがって、この:

Location.search(:geo => [53.348962, 83.777988], :order => "@geodist DESC").size

なります:

Location.search(:geo => [53.348962, 83.777988], :order => "geodist DESC").size

この例では、上記の例で指定されている座標の形式が正しくないことにも注意してください。ラジアンではなく度数です: http://pat.github.io/thinking-sphinx/geosearching.html。それらを変換するには、次のことができます。

def degrees_to_radians(degrees)
  degrees * Math::PI / 180
end

それが役立つことを願っています!

于 2014-06-28T07:52:33.193 に答える