智享技巧屋
第二套高阶模板 · 更大气的阅读体验

用地理位置做推荐?网站搭建中的实用算法思路

发布时间:2026-01-18 15:51:00 阅读:272 次

你有没有发现,打开某个本地生活网站,首页推的都是附近新开的餐馆、折扣活动或者共享充电桩?这背后不是巧合,而是基于地理位置的推荐算法在悄悄工作。

位置数据怎么变成推荐内容

用户一进来,系统先拿到他的经纬度。这个信息可以来自浏览器的 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,再查对应范围内的推荐池。

小网站没必要搞得太重。用好基础地理函数,加上一点用户行为逻辑,就能做出让人觉得“真懂我”的推荐效果。