微信里面怎么找不到附近的人(微信搜索附近的人怎么看不到我)

生活百科 2023-04-28 10:03生活百科www.xingbingw.cn

微信里面怎么找不到附近的人(微信搜索附近的人怎么看不到我)、本站经过数据分析整理出微信里面怎么找不到附近的人(微信搜索附近的人怎么看不到我)相关信息,仅供参考!

,这是一篇学习笔记,来自《极客时代》陈东老师的《检索核心技术20讲》。那很好。处理一些问题的算法经常让我耳目一新。本次聊天中的空间搜索算法就是其中之一。

一个空间搜索需求我们在使用地图的时候,经常会用地图搜索附近的酒店,附近的食品店,甚至附近的WC。换句话说,我认为酒店的位置是固定的。只需取搜索区域内酒店的经纬度和我们所在位置的经纬度计算距离,依次计算不同酒店的位置,然后进行排序,得到我们附近的前N家酒店。

如果我们在用微信,一定要熟悉附近的人的功能,那么我们怎么计算附近的人呢?和这家酒店不同的是人是流动的,计算起来比较麻烦。如果我们在网上的人和我们现在的人之间做一对一的位置计算,然后进行排序,显然不够清晰。虽然我们不知道街区有多远,,不同的城市是不能算作街区的(边界可能更近,后面再说),所以我们在计算距离的时候,只需要计算同一个城市的街区的人,这样可以大大减少计算量。

进一步说,如果我们周围的区域更小,一个区的在线用户与我们所在位置的距离就可以缩小。其实像这样的计算,我们只需要取最近的前N位,有时候不需要严格排序。

带着缩小面积的想法,我们来看看如何更快更恰当的计算距离。

为了计算距离,我们通常用经纬度来表示位置。我们需要把计算出来的空区分成不同的区域,每个区域用一个代码来标识。比如我们把一个城市按照经纬度分为四个区域,分别用代码00、01、11、10表示。如果我们继续将它们划分如下

如果需要更精确的距离,可以进一步划分,编码位数变成4,更精确。用这种编码方式,同一个区域的前缀码是一样的,有利于我们做区域查询。比如一个区域找不到的时候,我们可以扩大范围。

2.1就近解决查询错误问题。

前面说了,如果计算附近的人,就按照一个区域的人来搜索,减少了计算量。,还有一个问题,就是这个地区的人可能和我们不近,邻近地区的人可能更近,如下图所示

描述上图绿色三角符号表示我的位置。绿色圆圈和绿色三角形符号属于同一区域,但相邻区域更近。

对于这个问题,我们假设我们认为的附近区域是10km。如果我们只在这个区域搜索,显然我们可能会错过更近的距离。我们的区域扩大了一倍,从搜索一个区域到搜索九个区域,增加了八个附近的区域,这样就不会有遗漏。

2.2 Geohash编码刚才我们按照自己的理解对区域进行了编码。如果我们把地球看成一个大的二维空间,经度明显是水平的,维度是垂直的。地球的经度范围为[-180,180],维度的区间为[-90,90];我们假设编码的位置(经度104.07纬度30.67):

在纵向上,104.07的经度在0到180之间。我们将空白的右半部分编码为1,并在180度内继续一分为二。104.07的经度在90度到180度之间,继续编码为1,所以在经度上编码为11。方向,30.67维编码为0-90范围内的1,继续除法。30.67维度在0-45范围内编码为0,维度代码为10。综合起来,上述位置的代码为1110(先经度,再维度)。我们总共只用4位编码,显然粒度很粗。如果要细化,用更多的数字来表示,就用这种编码方式,把整个空的二维码转换成一维,这样计算和操作会更容易。如果我们用15位表示经度,15位表示维度,那么和就是30位,编码很长。,我们用32个字母(不包括A,I,L,O) 0-9和b-z对01字符串进行base32编码,将5个数字转换成一个字母和一个数字,形成一个相似度# 34;W3qcef # 34,以便将30位代码转换为6位字符串。这种用数字和字符来表示位置的编码方法称为GeoHash编码。

9位Geohash码是45位,也就是可以精确到4.8m,10位geohash码可以精确到1m左右。网上有对应的表格,你可以根据我们的精度要求选择Geohash编码的比特数。

缺点 由Geohash编码的字符或数字表示维度。可能我们在使用的时候,比如需要3m精度的时候,9位精度不够用,10位精度太精确用不上。这时候就需要改变编码方式或者直接使用原来的01字符串。

三种常见的全文搜索引擎,如Solr或es,都支持位置搜索。以solr为例,Solr支持多种距离场定义。常见配置如下

lt!-Solr 4.0 4.0版本4.0或更高版本有默认的字段类型定义,可能略有不同-gt;lt;类型名称=# 34位置# 34;索尔.latpointspatialfield # 34 doc values=# 34 True # 34;/gt。lt;type name=# 34 location _ RPT # 34 class=# 34 sol。spatialrecursiveprefixtreefield类型# 34;Geo=# 34 true # 34/gt。创建一些新的测试文档

添加lt gt lt;doc gt lt。字段名=# 34;id # 34 gt001 lt/field gt。lt;字段名=# 34;成都

Solr支持两种类似的查询分析器geofit查询分析器和bbox查询分析器。

3.1 Geofit Query Analyzer查询附近数据Geofit filter可以根据地理空间之间的距离,从给定点进行环形过滤,查询5km以内的数据。该命令如下所示

fq={!geofilterfield=location _ p pt=30.67,104.05d=1000} sfield:存储位置的字段名称。Pt:初始位置D:附近距离,单位公里结果显示

GEO使用两个步骤来获得结果

根据精度要求,创建一个边长为搜索距离的正方形边框,通过这个正方形过滤文档。计算位置与边框内中心的距离,然后排序,以距离为圆筛选出圆外的数据。如果数据量很大,那么就不需要精确的循环过滤,可以使用bbox inquirer。3.2 bbox query analyzer查询附近数据Bbox filter与geofit非常相似,只要它使用要计算的圆的边界框,它就采用与geofit相同的参数

fq={!Oxfield=location _ p pt=30.67,104.05d=1000}因为没有精准过滤,所以速度比较快,就不贴了。

3.3距离排序根据刚才的查询结果,最近的先来,那么有没有办法计算这个距离呢?solr中有支持排序的相关函数

fl=id,city_s,距离geodist(location_p,30.67,104.05) sort=geodist(location_p,30.67,104.05)asc,得分desc fl=id,city_s,距离geodist(location_p,30.67,104.05)sort=geodist(location _ p,30.67,104.05)asc,得分desc

和查询排序。

今天到此为止吧。

更多关于微信里面怎么找不到附近的人(微信搜索附近的人怎么看不到我)的请关注本站。

Copyright@2015-2025 www.xingbingw.cn 性病网版板所有