2011-08-23 80 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?