在Rails中进行邻近搜索

时间:2012-07-19 14:38:47

标签: ruby-on-rails ruby-on-rails-3 postgresql geocoding proximity

Rails有哪些邻近搜索选项? (也许各有利弊?)

  • 邮政编码数据库是否可行?
  • 或使用地理编码与宝石如Geocoder?
  • 是否有任何最佳做法或难以察觉?

(示例用法,企业可以列出的黄页类型应用程序,用户可以输入他们的邮政编码,找到靠近他们或在指定里程范围内的商家。)

更新:该应用与上面的示例应用完全相同 - 企业可以在应用中列出哪个是必不可少的目录(每个类型的业务都有类别),用户可以去到一个类别并按距离对结果进行排序(输入他们的邮政编码后 - 所以最接近他们的企业首先显示)。将不会按名称或其他标准进行搜索 - 只需访问“义和团犬种”页面并按距离排序即可。

3 个答案:

答案 0 :(得分:8)

答案取决于你想做什么。如果你想进行简单的近距离搜索(在半径和东西内),那么Geocoder宝石就更好了!现在,如果您想要更高级的搜索功能(多边形,多边形搜索等),我建议您使用PostrgeSQL数据库和精彩的PostGIS扩展名。要与Rails一起使用,你一定要查看PostGIS adapter for ActiveRecord来自一个名为RGeo的非常好的宝石的作者,该宝石使用超高速库GEOSProj作为地理空间计算。

否则如果您发现需要具有GIS功能的专用搜索服务器,那么您一定要使用ElasticSearch并且Ruby有一个很棒的宝石可以帮助您使用名为Tire的ES。

希望我帮忙!

答案 1 :(得分:1)

如果您计划添加附加搜索条件(例如公司名称,类别)或复杂排序,并且您的数据库将超过10000,我建议您使用外部搜索服务器。例如sphinx search + thinking sphinx

以下是geosearching的示例:http://freelancing-god.github.com/ts/en/geosearching.html

RoR模型解决方案(如Geocoder)对full text searching的效率不高。

答案 2 :(得分:0)

我自己没有使用地理编码的经验,但Alex Reisner的Geocoder宝石看起来是最好的选择,一英里。

  

Geocoder是Ruby的完整地理编码解决方案。使用Rails,它可以添加地理编码(通过街道或IP地址),反向地理编码(根据给定的坐标查找街道地址)和距离查询。就像在对象上调用地理编码一样简单,然后使用像Venue.near这样的范围(“Billings,MT”)。

查看README以获取有关如何使用它的完整示例。