ARTICLE / 2 MIN READ
搜索索引、结果集缓存与海量数据检索
从倒排索引、分页、聚合和缓存失效出发,设计可扩展的搜索服务。
搜索系统同时处理文本匹配、过滤、排序和聚合。索引保存的是可检索的结构,不是每个查询的永久结果集;结果缓存需要由业务明确管理。
索引和原始数据分离
原始订单或文章保存在事实库,搜索引擎保存用于检索的字段和文档 ID。索引重建、字段调整和数据修复都依赖事实库或事件日志,不能把搜索索引当成唯一数据源。
倒排索引适合文本和标签,数值索引适合范围过滤,排序字段通常需要额外的列式结构。字段越多,写入和更新成本越高,应按查询需求选择。
结果集什么时候缓存
重复率高、查询昂贵、允许短暂旧数据时,可以把规范化查询条件计算为 Hash:
search:result:{hash} -> 文档 ID 列表 + total + 版本
TTL = 30 秒
缓存只存分页 ID 或聚合摘要,详情再批量读取,避免把大对象复制到缓存。数据更新时可以按索引版本或租户版本失效,减少逐条删除的复杂度。
深分页和游标
使用很大的 offset 会让引擎跳过大量结果并重新排序。推荐使用 search_after、游标或基于排序值的分页。游标是短期查询状态,不应长期充当结果缓存。
聚合的成本
高基数字段聚合会消耗大量内存。对仪表盘固定指标,可以离线预聚合;对实时筛选,限制时间范围、桶数量和并发,超过预算就返回需要缩小范围的提示。
一致性与补偿
业务库写入后通过 CDC 或消息更新索引,期间会存在延迟。搜索结果页要接受短暂不一致,详情页仍从事实库校验状态。索引消费失败进入重试和死信,定期用全量对账修复漏文档。
搜索性能优化不能只看单次查询耗时,还要观察索引大小、刷新延迟、段合并、缓存命中、P99、深分页比例和重建时间。
GITHUB DISCUSSION
评论与回复
评论保存在 GitHub Discussions,登录 GitHub 后即可参与,发布和回复都在本页完成。
评论区进入视口后自动加载。