2014-10-27 85 views
2

我在考慮使用思維獅身人面像,因爲我已經使用過ElasticSearch並且想嘗試新的東西。思維獅身人面像的地理距離過濾器

在使用ThinkingSphinx時,如何設置地理距離過濾器。將有一個用戶模型包含用戶的基本信息,包括他們的郵政編碼。有一個位置模型可以獲得美國的地理信息(郵政編碼,緯度,經度,州)。

例:當前用戶「邁克爾」的郵政編碼是在搜索表單「程序員,視頻遊戲」邁克爾30601.類型。返回的結果將 秀誰擁有從用戶模型中的 屬性,它位於30601.

我已經安裝了ThinkingSphinx的 邁克爾的拉鍊碼100英里範圍內的話「程序員」或「視頻遊戲」用戶,並在我的應用程序,如果我按照上面的例子詳細執行了搜索,它將返回「程序員」或「視頻遊戲」比賽,但只與100%與郵政編碼完全匹配的用戶(它使用地理位置取消DIST)。現在使用我的代碼,我可以使用郵政編碼執行地理距離搜索,這將返回周圍的用戶。當我將用戶模型中的屬性與郵政編碼相關時,地理距離似乎不起作用。

這個過程很容易使用彈性,但我想看看思維獅身人面像是如何工作的。如果有人對搜索控制器的外觀如何有線索,請

回答

1

從Sphinx的角度來看,郵政編碼並沒有用 - 這一切都歸結爲經緯度。

所以,如果在你的榜樣邁克爾current_user,你可能有一個搜索調用看起來像這樣:

User.search 'programmer video games', 
    :geo => [current_user.latitude, current_user.longitude], 
    :with => {:geodist => 0.0..161_000.0}, 
    :order => 'geodist ASC' 

請記住,這假定您存儲有弧度的緯度和經度值,而不是度。如果他們是度數,那麼您需要在索引定義中(如the docs中所述)以及您搜索時(例如current_user.latitude * Math::PI/180.0)將其轉換。

當按距離過濾時,斯芬克斯使用米 - 一英里幾乎是1610米,因此我在上面的示例中進行了轉換。

+0

謝謝。一旦你瞭解了獅身人面像的工作方式,設置非常簡單。 – pwz2000 2014-10-30 15:09:46