0

我有一个问题,不知道从哪里开始:

  • 我有选择地理定位数据的用户(例如:旧金山,50 英里)
  • 我需要对此进行搜索(例如:圣何塞)并返回在其周边拥有城市的用户。

我使用 Sphinx(但可以选择更改)和 MySQL,我尝试在索引时为所有城市创建一个多属性:它在索引时使我的服务器崩溃。所以我做了一个 cron 在数据库中存储 User -> City 链接。它适用于 Sphinx,但我的 cron 有点太贪心了(而且表格增长得非常快,一个用户可以在他的周边拥有近 1000 个城市)。

你知道一个好的解决方案吗?

谢谢

4

2 回答 2

0

这可以通过 Sphinx 实现。您需要在数据库中拥有每个城市的latitudelongitude,并且需要在 Sphinx 中添加为属性。

Sphinx 使用魔法函数@geodist计算范围内的兴趣点 (POI)。

需要更改 Sphinx 配置文件,如下所示:

source geolocation
{
    sql_query            = select city_id, radians(longitude) as longitude,   
                           radians(latitude) as latitude from cities 
    sql_attr_float       = longitude
    sql_attr_float       = latitude
}

请注意,sql_query使用radians函数来转换degrees to radians. sql_attr_float告诉 Sphinx 经度/纬度是浮点数。这是魔术@geodist功能所需要的。sql_query_info如果您在命令行上调试,这很方便。

下面是PHP执行 Sphinx Search 以检索地理位置搜索的代码

$_longitude = $_GET['longitude'];
$_latitude = $_GET['latitude'];
$_radius = $_GET['radius'];

$search = new SphinxClient();
$search->SetServer("localhost", 3312);
$search->SetMatchMode(SPH_MATCH_ALL);
$search->SetArrayResult(true);
$search->SetLimits(0, 100);
$search->SetGeoAnchor('latitude', 'longitude', (float) deg2rad($_latitude),  
                     (float) deg2rad($_longitude));

$circle = (float) $_radius * 1.61;
$search->SetFilterFloatRange('@geodist', 0.0, $circle);

$result = $search->Query('', 'geolocation');
于 2013-02-08T09:41:51.483 回答
0

我去年有一个和你类似的项目,也遇到了同样的问题。我不得不切换到 SphinxQL 而不是 php API,并且首先工作得更快,并且你有更多的选择作为 API 给你。

于 2014-07-18T14:46:02.883 回答