你有没有发现,打开某个本地生活网站,首页推的都是附近新开的餐馆、折扣活动或者共享充电桩?这背后不是巧合,而是基于地理位置的推荐算法在悄悄工作。
位置数据怎么变成推荐内容
用户一进来,系统先拿到他的经纬度。这个信息可以来自浏览器的 Geolocation API,也可以是用户主动填写的地址。有了位置,就能算距离。比如你在北京朝阳大悦城,系统就会优先把三公里内的商家拎出来。
但光按距离排太死板。谁会天天点开看离自己最近的便利店?真正有用的是结合行为数据。比如某人常在晚上搜咖啡馆,算法就该推附近夜间营业、评分高的店,而不是单纯最近那家煎饼摊。
简单实现:加权距离 + 热度
一个轻量级方案是给每个候选对象打分。公式可以长这样:
score = (1 / (1 + distance)) * 0.6 + popularity * 0.4
distance 是用户到目标的公里数,popularity 可以是点赞数或访问量归一化后的值。越近、越火,得分越高。这个模型不复杂,适合中小型网站起步。
数据库里怎么存位置
MySQL 从 5.7 开始支持 POINT 类型。建表时可以这样设计:
CREATE TABLE shops (
id INT PRIMARY KEY,
name VARCHAR(100),
location POINT SRID 4326,
INDEX(location)
);
-- 插入数据
INSERT INTO shops (id, name, location)
VALUES (1, '社区奶茶店', ST_PointFromText(
'POINT(116.481084 39.90193)', 4326));
查附近 5 公里的店铺,用 ST_Distance_Sphere:
SELECT id, name,
ST_Distance_Sphere(location, ST_PointFromText('POINT(116.48 39.90)', 4326)) AS dist
FROM shops
WHERE dist <= 5000
ORDER BY dist LIMIT 10;
注意隐私和性能
别一上来就问定位。可以先让用户手动选个区域,等信任建立了再引导授权。另外,频繁计算距离很耗资源,热门城市建议做缓存。比如把北京划成若干网格,用户进来先匹配网格 ID,再查对应范围内的推荐池。
小网站没必要搞得太重。用好基础地理函数,加上一点用户行为逻辑,就能做出让人觉得“真懂我”的推荐效果。