Reddit 的 CTO Chris Slowe、工程副总裁 Nick Caldwell 和工程总监 Luis Bitencourt-Emilio 在 Reddit 网站上披露了 Reddit 搜索模块的发展史。以下内容翻译自博客内容,查看原文 The Search for Better Search at Reddit 。
在过去,新来的工程师总会问:“什么时候可以把我们的搜索引擎弄好?”在今年之前,我们的答案通常是:“到 5 楼去问问搜索引擎团队吧。”但实际上到 5 楼的电梯按钮根本不管用,而且根本不存在什么搜索引擎团队。
但时代在改变。我们现在很高兴地宣布,Reddit 新的搜索模块诞生了。在过去几周,它已经承担了 Reddit 50% 的搜索流量,提供了将近 5 亿次搜索。现在我们很有信心可以让它承担起 100% 的流量,我们也希望你们能够喜欢这样更快也更稳定的搜索结果!
我们在 Reddit 开辟了一个与搜索相关的产品单元,并由工程总监 Luis 领导该产品。我们也意识到这些技术对 Reddit 的未来来说是至关重要的。我们的平台拥有世界上最有趣的内容,包括 2.5 亿个帖子,而且每天都在增长,但苦于难以对这些内容进行搜索。通过改善搜索体验,用户就可以直接在主页上定制想阅读的内容。
Reddit 搜索模块简史
做好搜索不是件轻而易举的事情,在过去的 12 年中,我们的搜索架构经历了 6 次技术栈演化。
- 2005 年,联合创始人(现在的 CEO)Steve Huffman 开始使用 PostgresSQL 的 tsearch2。那个时候一切都还很简单,用 Postgres 就足够了。Postgres 能够做很多事情,它的触发器真的很好用。不过它的缺点是不够灵活,我们很快就发现其中的少部分搜索会影响到其他大部分的查询操作。
- 2007 年,工程元老(现在的 CTO)Chris Slowe 使用 PyLucene 重新实现了搜索模块。它是一个单进程的 Python RPC 服务器,建立在 TCP 之上,支持多线程。最初的版本支持搜索帖子的标题和评论,Lucene 索引文件单独保存。在这一时期我们还没有迁移到 AWS 上,而且确实也考虑过使用 Google Search Appliance 。这一版本相对灵活,但伸缩性比较差。
- 2008 年,Reddit 的三号员工(现在是搜索工程师)David King 使用 Solr 重新实现了搜索模块。他自己开发了一个叫作 pysolr 的工具,将最新的文档通过 XML 格式传给 Solr,然后将响应封装成我们的查询模型可以识别的格式。最初版本不支持搜索评论,不过后来支持了。
- 2010 年,David 使用 IndexTank 代替了 Solr。网站流量一直在增长,我们的 PV 达到了每月十亿的级别,而我们只有四个工程师在后面支撑。我们不断添加 Postgre 数据库作为读副本,添加缓存,还用上了早期版本的 Cassandra ,但是搜索体验仍然很糟糕。
- 2012 年,LinkedIn 关闭了 IndexTank 项目,于是 Keith Mitchell 开始使用 CloudSearch。在 LinkedIn 收购 IndexTank 并将其关闭之后,我们不得不迁移到 AWS CloudSearch 上。后来我们又从旧的 AWS CloudSearch 迁移到新的 CloudSearch 上,但仍然存在性能问题,有将近三分之一的查询无法在 5 秒钟内完成,导致出现搜索错误页面。
- 现在,我们使用了 Lucidworks 的 Fusion!我们要确保搜索模块能够满足三个方面的要求:快速、伸缩性和相关性。我们与来自 Lucidworks 的搜索专家合作,他们当中有好几位是 Solr 项目的贡献者。
数据摄取(ingest)
在进行搜索系统迁移的过程中,最大的挑战莫过于更新索引管道了。在进行第一次尝试时,我们为了加快速度,直接使用了我们的遗留 ETL 系统,这个系统由 Jenkins 和 Azkaban 组成,我们在上面运行很多 Hive 查询。从下图可以看出,将多个数据源并入单个点进行索引比我们预期的要复杂得多。
在进行第二次尝试时,我们使用了更简单的方案,也得到了更好的结果。我们把整个管道分成了四个简单地 Hive 查询,在索引帖子方面提升了 33% 的速度。另一方面,我们只索引新创建的帖子,同时实时地更新投票和评论的相关度。
提升相关性
低相关度的搜索是没有意义的。在发布搜索系统的时候,我们的主要目标就是要保证搜索结果的相关性不受影响。
我们将新系统和旧系统的搜索结果页面的点击率进行了对比。一个完美的搜索引擎,它提供的搜索结果(排名靠前的部分)会有 100% 的点击率。当然,我们知道完美的搜索引擎是不存在的,所以我们使用 Mean Reciprocal Rank 和 Discounted Cumulative Gain 算法来对比搜索结果的质量。
从图中可以看出,Fusion 的线条形状更锐利,可见我们在相关度方面还有很大提升的空间,而且可以进行个性定制、机器学习以及查询优化和重写。
发布推广
在解决了数据摄取和相关度问题之后,我们要让更多的 Reddit 用户使用它。来自社区的反馈对我们来说是非常有价值的,他们发现了一些表层的 bug 和一些不常见的问题。刚开始我们只让 1% 的用户使用我们的新系统,然后是 5%、10%、25%,在发布 GA 版本的时候是 50%。
我们可以很自信地说 Reddit 现在的搜索模块比以往任何时候都要好。对 Reddit 所有的内容进行重新索引只需要 5 个小时(之前是 11 个小时),而且我们还持续更新索引。错误率下降了两个数量级,99% 的搜索都能在 500 毫秒内完成。机器数量从原先的 200 多台下降到 30 多台,我们因此节约了很多成本。
搜索的未来
我们希望新的搜索模块能够让大家更容易地在 Reddit 上找到自己感兴趣的内容。但我们不会止步于此,做好搜索只是我们迈出的第一步,我们希望在个性化和相关性方面给 Reddit 用户带来更好的体验。
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论