我开发了一个电报机器人,它匹配2个用户使用相同的语言,当他们都在寻找有postgres查询的合作伙伴时。 我想添加可选功能,以便根据位置(最近用户)匹配用户。 因为它是一个选项,我认为我将默认保持列为null,如果用户发送他的位置,我添加它。 我将使用postigs实现这一点。 我有两个问题:
使用地理或几何图形会更好吗?因为人们可以来自世界各地,我在这些情况下阅读最好使用地理,但无论如何我不需要任何精确的数据,只知道谁是最亲近的用户和他们之间的距离(也大约只是在匹配时显示为附加信息)。我希望查询能够快速运行(我的意思是不到1秒)。我正在考虑使用KNN在列上创建索引并使用< - >命令。这是一个不错的选择吗?你会为此做些什么?几何或地理?我的想法很好吗?
因为,正如我所说,该字段也可以是NULL是用户不希望提供的位置我想给予指定位置的用户更好的优先级,如果有的话没有指定位置我从NULL值用户中取一个随机数。这可以通过查询吗?
我的机器人是用python编写的,如果有帮助的话。
非常感谢
答案 0 :(得分:0)
根据第1点,我认为本文将最好地回答您的问题
http://postgis.net/docs/manual-1.5/ch04.html#PostGIS_Geography
关于速度 - 只需在你的geom / geog列创建gist索引并使用st_Dwithin(geom1,geom2,100)并按st_distance(geom1,geom2)命令结果它将足够快,直到你有数千万的用户。
第2点:是的,它只是联盟,例如
select *, st_distance(u1.geom, u2.geom) dist from
(Select u2.*
from users u1, users u2
where u1.id=1
and u1.id<>u2.id
and st_dwithin(u1.geom, u2.geom, 5000)
UNION
Select * , null dist
from users
where id<>1
and geom is null
LIMIT 1) a
order by dist
我错过了其他标准谎言性别,年龄等,但当然在两个选择中使用它