在现代电商领域,搜索体验直接影响用户满意度和平台的商业转化率。Instacart作为领先的在线杂货配送平台,面临着海量商品数据、频繁更新的库存信息以及多样化用户需求,这对其搜索系统提出了极高的技术挑战。为应对这些挑战,Instacart团队重塑了搜索基础设施,基于Postgres数据库打造了一套前沿的混合检索架构,从而实现了高效、精准且可扩展的搜索服务。 搜索作为Instacart用户在APP中最主要的入口之一,必须能够快速响应并呈现精准结果。传统全文检索系统通常依赖关键词匹配,容易忽略用户查询背后的语义意图,导致检索结果与用户期望不符。相较而言,基于向量的语义检索能够捕捉查询与商品描述间的深层语义关系,弥补关键词匹配的不足。
然而,早期Instacart的搜索架构采用了独立的全文检索和语义检索系统,分别通过Elasticsearch和FAISS实现。两者分开带来了过度抓取(overfetching)、数据同步复杂及运维压力大等诸多问题。 面对这些痛点,Instacart确定了统一检索体系的目标,计划将传统的文本检索和先进的语义向量检索融合到同一数据平台。Postgres数据库凭借其强大的数据管理能力和扩展插件生态成为首选。早期,Instacart将全文搜索功能从Elasticsearch迁移至分片Postgres集群,借助其GIN索引和定制的排名函数优化搜索性能。同时,Postgres的数据高度规范化大幅减少了写负载,解决了Elasticsearch中因大量实时更新导致的索引维护瓶颈,实现性能和成本的双重提升。
迁移至Postgres后,团队将机器学习模型生成的特征和权重以结构化形式存储于数据库中,使得复杂的检索逻辑能够通过SQL高效实现。与此同时,将计算尽可能下沉至存储层,实现数据与计算的紧密耦合,显著缩短了响应时间。利用NVMe高速存储进一步强化了数据读取速度,整体系统响应速度提升一倍以上。 2021年,Instacart引入了语义搜索能力,基于Huggingface MiniLM-L3-v2模型生成向量,并利用Meta的FAISS库执行近似最近邻(ANN)检索。此时,全文检索仍在Postgres中运行,语义检索在独立服务中执行。两套系统结果通过线性排序模型合并,部分提升了搜索质量。
然而,界面上的系统复杂性和数据同步难题依旧存在,且FAISS在属性过滤上存在限制,导致检索结果需在后处理阶段再行筛选,扩大了系统负担。 为解决上述不足,Instacart团队将目光投向了Postgres的向量检索插件pgvector。pgvector支持在Postgres内部直接实现高效的ANN检索,使文本与向量检索可以统一在一套数据库中完成,从而大幅简化系统架构。通过原型集群进行线下模拟测试,发现pgvector在满足Instacart海量检索吞吐与低延迟的同时,召回率优于FAISS。并且,通过对Postgres参数如max_parallel_workers_per_gather和max_parallel_workers进行调优,以及优化Embedding列存储结构,整体性能得到了进一步提升。 结合pgvector,Instacart建立了基于零售商维度的混合索引策略,而非为每个零售商单独维护数百个索引,显著降低了管理复杂度和运维成本。
这种针对不同商家的多样化处理有效利用了查询分布和商品规模差异,提升了检索效率。 在上线A/B测试后,系统显示查询无结果的情况下降了6%,直接转化为用户更少搜索死角和平台收入的提升。通过消除独立服务间的数据复制和同步障碍,系统的稳定性和一致性得到了增强。此外,由于检索全部在Postgres中完成,借助其丰富的SQL语句,属性过滤得以灵活实现。团队使用实时库存信息作为预过滤条件,结合品牌、类别等维度过滤,更精细地控制了检索范围,提高了搜素的精准性和响应速度。 总结来看,Instacart融合全文检索和语义向量检索于Postgres中,构建起统一、高效且可扩展的混合搜索基础设施,极大提升了用户搜索的相关性和满意度。
通过将计算下沉到数据层、优化索引结构、合理分片与并行化配置,解决了电商场景中海量数据的动态更新和多样化需求难题。与FAISS等独立工具相比,pgvector兼具性能和灵活性,是实现混合搜索的理想选择。 该项目的成功离不开跨团队的协作,涵盖机器学习、后台开发以及核心基础架构多方面专家的通力配合。未来,Instacart计划进一步拓展属性过滤能力,增强个性化推荐,并持续优化搜索算法模型,持续提升购物体验。随着电商平台数据复杂度不断升级,Instacart的Postgres混合检索架构为行业提供了宝贵的参考和实践案例,彰显了将关系型数据库与先进机器学习技术结合的巨大潜力。 。