2011-04-03 32 views
2

我試圖讓一個地理搜索通過關聯來工作。非常相似,這傢伙:ThinkingSphinx:通過關聯運行SQL字符串

How do I geo-search multiple models with ThinkingSphinx?

的一個區別是,我試圖用自定義的SQL語法的關聯語法結合起來。它不會對索引打印任何錯誤,但是當我嘗試搜索失敗:

class Person 
    define_index do 
    indexes tags(:text), :as => :tags 

    has media.location.lat('RADIANS(location.lat)'), :as => :lat, :type => :float 
    has media.location.lng('RADIANS(location.lng)'), :as => :lng, :type => :float 
    end 

    sphinx_scope(:by_location) { |loc| 
    { :geo => [loc.lat.to_radians, loc.lng.to_radians], 
     :with => {"@geodist" => 0.0..loc.radius }, 
     :latitude_attr => "lat", 
     :longitude_attr => "lng" 
    } 
    } 
end 

#running this search from console 
Person.by_location(Location.first) 

這是錯誤:

ThinkingSphinx::SphinxError: index fulfillment_core: unknown latitude attribute 'lat'

我試過沒有SQL字符串配置它 - 這運行沒有錯誤,但數學當然是完全錯誤的,因爲它試圖在度數上進行弧度操作。

是否有任何方法來結合轉換和關聯,或者我堅持存儲我的數據爲弧度而不是度數?

回答

3

您的索引定義並不完全正確。請嘗試以下操作:

define_index do 
    indexes tags(:text), :as => :tags 

    # forces the join on media and location associations 
    join media.location 

    has 'RADIANS(location.lat)', :as => :lat, :type => :float 
    has 'RADIANS(location.lng)', :as => :lng, :type => :float 
end 
+0

完美!加入是我錯過的。謝謝帕特! – brandon 2011-04-04 00:21:43

+0

謝謝,帕特!你的回答非常感謝(我一直都在看)。 – Abdo 2012-01-10 15:51:37

+0

有沒有辦法在那裏命名「連接表」?例如,讓我們假設上面的人有一個位置以及media.location。你怎麼能區分這兩個表達式? – Abdo 2012-01-18 15:38:25