什么是附近搜索的最佳方法? (PHP& MYSQL)

时间:2011-10-04 12:28:11

标签: php mysql database search

  

可能重复:
  Get polygons close to a lat,long in MySQL

在附近搜索> = 5,000,000行数据的最佳方法是什么(也可以按地点类别过滤(例如想要搜索附近的“加油站”)&& filter by keyword),以及按距离ASC排序。

是这样做的任何教程/算法吗?数据库结构如何,可能一定要做集群?因为如果我们在一张大桌子上搜索,就需要时间。

注意:让我们说在表内有10个字段(地名,地址,类别,长,纬度等)。 实际上,我试试这个http://www.arubin.org/files/geo_search.pdf,但它仍然很慢。

3 个答案:

答案 0 :(得分:2)

另外,如果你想坚持使用纯粹的mysql解决方案,可以使用空间索引来大大改善“附近”搜索。

这些在stackoverflow上有很好的讨论 https://stackoverflow.com/search?q=spatial+index+mysql&submit=search

答案 1 :(得分:1)

因为您想要“按关键字过滤”,我建议您使用专用引擎。

我个人最喜欢的是SphinxSearch http://sphinxsearch.com/about/sphinx/ ......它也非常有能力进行地理查询。

许多讨论如何进行超快速地理查询的线程 http://sphinxsearch.com/forum/search.html?q=tiles&f=1

答案 2 :(得分:0)

如果您想要附近的搜索,首先需要您要比较的每个位置的地理位置以及您要比较的用户的地理位置。要获取您所在位置的坐标,您可以使用带有地理位置信息的邮政编码数据库。网上有很多可用的价格非常合理(整个美国的平均价格约为90美元)。

然后您需要对您的用户进行地理定位,这可以使用geoip例程完成,或者使用HTML5地理定位API完成。

获取用户的位置后,可以使用“简单”距离计算函数计算lat / long 1和lat / long 2之间的距离:(Lat1 =用户,Lat2 =要比较的位置的dbfield)

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` FROM `members` HAVING `distance`<=’10′ ORDER BY `distance` ASC

只需在HAVING中指定距离限制或根据需要限制结果数量,即可根据需要调整查询。