题目重点:MLE Onsite SD 单独追问 geohash;解释编码用途、前缀精度与附近查询必须扩相邻格并按真实距离过滤。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版输入经纬度和搜索中心/半径,目标召回附近 listing 候选;距离阈值和地球模型由 API 定义。
- Geohash 将地理位置离散编码成可按前缀分组的格子,编码粒度可选;不把前缀相同当作精确‘距离近’。
解题路线
- 把经纬度范围交替二分生成位序列,再编码成字符前缀;前缀越长格子越小,空间局部性更细,但查询跨更多格。
- 按查询半径与纬度选合适精度,取中心格及覆盖搜索形状的邻居格,把相应前缀作为索引候选;不要只查中心格,否则边界附近房源会漏。
- 在候选集上用约定的球面/投影距离做精确二次过滤,并叠加日期、人数和价格可用性;返回按稳定距离/ID 或业务 rank 排序。
- 处理极区/日期变更线、密集城市热点与稀疏地区:可变精度、多级索引或空间数据库索引,监控候选数、误报与漏召。
- 如果用于推荐系统,geohash 是召回/特征的一种,不可直接替代最终排序、库存复核或公平性约束。
手动走一遍
训练例:用户在某格右边界附近,半径 2km 内的房源可能落在右邻格。只检索用户 geohash 前缀会漏掉它;查中心及相邻格后还要排掉邻格中实际相距 10km 的房源。数字仅示意。
规模与取舍
编码长度与选择位数线性;查询成本约覆盖格数×每格候选量,再加精确距离过滤。精度太粗会加大量误报,太细会扩大量格查询;题目无半径/密度不能给固定前缀长度。
易错点与追问
容易失分的边界
- 只查一个 geohash 格。
- 前缀相同就认为必在半径内。
- 固定精度覆盖所有纬度/密度。
- 忽略经度环绕和极区边界。
- 把地理召回与实时可订保证混为一谈。
继续深挖
- 半径跨多个格怎样保证不漏?
- 城市中心热点怎么处理?
- 为什么还要精确距离二次过滤?
- 与 R-tree/H3 等空间索引取舍是什么?
