5

我刚刚在我的应用程序中实现了 Sunspot gem,我真的很喜欢它,只是当我进行位置搜索时,它似乎排除了一些结果。例如:我住在俄亥俄州哥伦布市,所以如果我搜索“俄亥俄州哥伦布市”,我的应用程序会将其转换为 lat/lng,然后我会这样做:

@search = (Skatepark.search {

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

})

这将返回一些在哥伦布西侧进行地理编码的记录,但我的数据库中没有位于东侧的记录。我的搜索是否做错了什么?

您可以在http://skateparks.co/search自己尝试一下

如果您搜索“俄亥俄州哥伦布”,您将获得与搜索“俄亥俄州兰开斯特”(距东南仅几英里)完全不同的结果。

4

1 回答 1

4

这是因为 Sunspot 依赖于生成地理空间索引的gem 'pr_geohash' 。

geohash是z 阶曲线的一种形式。

您正在尝试使用此索引解决最近邻问题,其本质上只能产生近似结果。作者会选择这种方法,因为 Solr 旨在处理遭受维度诅咒的大型数据集。

根据您的要求,也许您应该尝试

  1. 筒仓解决方案,例如。Freebase(有几个 gem
  2. SaaS解决方案
  3. 空间数据库
  4. 一个地理数据库
  5. 还是你自己的方法

建议的解决方案

对城市、城镇和村庄使用geojson对象,而不是简单的纬度/经度。使用语义自动补全,以便用户可以直接从 Freebase 中选择多边形。(界面示例:Quora搜索框)这样,在您现在进行多边形边界搜索而不是径向搜索时,将返回所请求城市中的所有结果。

我敦促您将您的数据作为父级为城市/城镇/村庄的 Freebase位置提供,如果考虑到您的业务模型,这完全可能的话。事实证明,位置类型位置主题都已为您准备好。

更新 1

我注意到你在 Heroku 上。

如果您有专用数据库,则可以使用PostGIS

如果没有,请阅读如何使用共享数据库在 Heroku 上进行 GIS 查询?

于 2011-08-27T20:07:53.027 回答