加载中…
正文 字体大小:

查找附近的商铺/人/热点(sphinx/mongodb)

(2013-12-12 10:34:35)
标签:

mongodb

sphinx

it

分类: geo
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 [ Sphinx 2.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。但是结果中有直接给出距离。

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有