思考狮身人面像geosearch问题

时间:2013-02-13 12:38:47

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

我需要按距离传递坐标的距离搜索位置。

应用程序/索引/ 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-release(r3473; 2012年10月22日)
  • thinking-sphinx(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

1 个答案:

答案 0 :(得分: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

希望有所帮助!