我遇到了问题,并且真的不知道从哪里开始:
我使用Sphinx(但可以选择更改)和MySQL,我尝试在索引时为所有城市创建一个多属性:它在索引时崩溃我的服务器。 所以我创建了一个存储用户的cron - >城市链接在数据库中。它适用于Sphinx,但我的cron有点过于贪婪(桌子增长得非常快,用户可以在他的周边有近1000个城市)。
你知道一个很好的解决方案吗?
由于
答案 0 :(得分:0)
这可以通过Sphinx实现。您需要拥有数据库中每个城市的latitude
和longitude
,并且需要在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
会很方便。
以下是执行Sphinx搜索以检索地理位置搜索的PHP
代码
$_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');
答案 1 :(得分:0)
我去年有一个类似于你的项目并遇到了同样的问题。我不得不切换到SphinxQL而不是php API,并且第一次工作得更快,你有更多的选择,因为API给你。