2011-08-23 81 views
5

我剛剛在我的應用程序中實現了太陽黑子寶石,我非常喜歡它,除了當我進行位置搜索時,它似乎排除了一些結果。例如:我住在俄亥俄州哥倫布市,所以如果我搜索「俄亥俄州哥倫布市」我的應用程序轉換到這一個緯度/經度和我做的:太陽黑子空間搜索沒有返回結果

@search = (Skatepark.search { 

    with(:coordinates).near lat, lng, :precision => 3 
    fulltext text 
    paginate :page => params[:page], :per_page => 15 

}) 

這會返回一些記錄被哥倫布西側地理編碼但是我的數據庫中沒有記錄在東面。我在搜索時做錯了什麼?

您可以在http://skateparks.co/search

試了就知道如果你搜索「俄亥俄州哥倫布市」,你會得到,如果你搜索「蘭開斯特俄亥俄州」,這是隻有幾英里的東南不是完全不同的結果。

+0

確保記錄(從搜索失蹤)具有緯度和經度值。根據數據來自何處可能如此簡單。 – dwhalen

回答

4

這是因爲太陽黑子取決於生成地理空間索引的gem 'pr_geohash'

A geohashz-order curve的一種形式。

您試圖使用此索引解決nearest neighbor problem,其性質只能產生近似的結果。作者會選擇這種方法,因爲Solr被設計用於處理大數據集,其中suffer from the curse of dimensionality

根據您的要求,也許你應該試試

  1. 一個siloless解決方案如。 Freebase(有several gems
  2. 一個saas solution
  3. 一個spatial database
  4. 一個geodatabase
  5. 或您自己的approach

建議的解決方案

使用cities, towns, & villages,而不是簡單的經/緯度geojson對象。使用semantic autocompletion,以便用戶可以直接從Freebase選擇多邊形。 (接口示例:Quora搜索框)通過這種方式,將返回所請求的城市中的所有結果,因爲您現在正在執行多邊形邊界搜索而不是徑向搜索。

我強烈建議您將您的數據作爲Freebase Locations提供,其中父母爲City/Town/Village,如果在您的商業模式下這是完全可能的。結果發現有一個location type和一個location topic都準備好了。

更新1

我注意到你在Heroku上。

如果你有一個專門的分貝,你可以使用PostGIS

如果沒有,請閱讀How do you do GIS queries on Heroku using the shared database?