题目重点:Onsite SD 题目问查询用户搜索和下单信息,并支持指定时间与地理位置;按事件关联、时空索引与权限设计。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版 SearchEvent 含 userId/searchId/eventTime/搜索地点,BookingEvent 含 userId/bookingId/searchId?/eventTime/listingGeo;是否有 searchId 直接关联题目未披露。
- 位置过滤训练版按搜索目的地或被订 listing 的地理单元由调用方显式指定,不混两者。
- 只允许授权的运营/本人按权限查日志,位置与搜索记录属于敏感行为数据,输出最小化并留审计。
解题路线
- 先定义用户故事:查某用户历史、按时间/地理范围找搜索与预订、还是分析 search→booking 转化;不同目的决定索引和聚合口径。
- 摄取搜索/下单事件时校验 userId、时间、位置与可选 searchId,保存不可变事件并做去重;若无直接 searchId,归因必须用时间窗/会话规则,不能凭同用户就认定一一对应。
- 原始事件按日期分区,建立 userId+eventTime 访问路径和地理单元(如 geohash/网格)+eventTime 的检索路径;精确圆形/多边形查询对网格候选做二次空间过滤。
- 组合条件先用高选择性索引召回,随后按另一维过滤,稳定按 (eventTime,eventId) 游标分页;跨来源聚合可建按用户/时间的读模型,但需展示摄取延迟与晚到修正。
- 监控查询 p99、数据新鲜度、位置过滤误差、索引热区、权限访问及保留/删除一致性。
手动走一遍
训练例:用户 u 在 10:00 搜索纽约,11:00 预订波士顿房源。按搜索地点=纽约查应返回 search event;按预订房源地点=纽约查不应返回该 booking。若题目要 search→booking 归因,还需明确是否存在 searchId 或限定窗口。
规模与取舍
索引查询约 O(log N+候选数+分页输出);时空网格精度越细,查询需跨更多格但误报更少,粗格相反。题目无数据量,不能指定分片/保留天数。
易错点与追问
容易失分的边界
- 把搜索地点当预订房源地点。
- 没有事件关联键仍宣称精确归因。
- 先扫全表再在应用层筛时间/地理。
- 只用 geohash 前缀而不做边界二次过滤。
- 用户行为数据无权限与删除策略。
继续深挖
- 没有 searchId 时如何定义转化?
- 跨设备 userId 如何合并?
- 晚到订单如何修正统计?
- 跨 geohash 边界的半径查询怎么保证不漏?
