查找附近的商铺/人/热点(sphinx/mongodb)
发布于:2014-08-29 10:58:49 - 查看:2721次
from: http://blog.sina.com.cn/s/blog_6602680d0101qj4j.html
1.贴sphinx代码:
//为地理距离计算设置锚点,并且允许使用它们后面两个参数是当前位置的弧度,官方文档有错误
SetGeoAnchor('lat','lng', (float)deg2rad($lat) ,(float)deg2rad($long))// 按距离排序
SetSortMode(SPH_SORT_EXTENDED, '@geodist asc')//筛选范围(多少米之内)
SetFilterFloatRange("@geodist", 0.0,floatval($range*1000));
在Coreseek Fulltext 4.1 [ Sphinx2.0.2-dev]配置时,必须得有一个string的查找字段,
如 sql_field_string =name,虽然在此处中不对name做搜索,
若配置成 sql_attr_string =name则建索引不成功。此坑很坑爹
2.用mongo做可以有三种办法求球面距离,用mongo新支持的2d sphere索引。
1)$query=array(
'loc'=>array(
'$geoWithin'=>array(
'$centerSphere'=>array(
array(
(float)'121.01',(float)'32' ),
floatval(100/6371)
) ) ));
这个可以没有2d sphere。
此办法对距离没有排序,需要手动计算距离并排序,
但是用geoWithin查找较好,用find查找,支持skip和limit
2)$query=array(
'loc'=>array(
'$nearSphere'=>array(
(float)'121.01',(float)'32' ),
'$maxDistance'=>(float)(100/6371)
));
这个必须有2d sphere。
此办法结果中位置已自动排序,但是还需要手动计算距离,
find还支持skip,limit,count,分页翻页方便,推荐使用。
3)$query=array(
array(
'$geoNear'=>array(
'near'=>array( (float)'121.01',(float)'32'),
'distanceField'=>'calculated',
'maxDistance'=> floatval(100/6371),
'limit'=>1000,
'spherical'=>true
), ),
array( '$limit'=>100 ), array( '$skip'=>0 ));
这个必须有2d sphere。此种使用aggregate来查找,
距离默认已排序,支持skip和limit,但是没有count。但是结果中有直接给出距离。