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

发布于:2014-08-29 10:58:49 - 查看:1683次

 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。但是结果中有直接给出距离。