Reddit搜索模块发展简史

2017 年 9 月 25 日 AI前线 Reddit

译者|薛命灯
编辑|Emily


在过去,新来的工程师总会问:“什么时候可以把我们的搜索引擎弄好?”在今年之前,我们的答案通常是:“到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用户带来更好的体验。


作者介绍



Reddit的CTO Chris Slowe、工程副总裁Nick Caldwell和工程总监Luis Bitencourt-Emilio在Reddit网站上披露了Reddit搜索模块的发展史。以下内容翻译自博客内容,查看原文The Search for Better Search at Reddit。



登录查看更多
1

相关内容

互联网
【Manning新书】现代Java实战,592页pdf
专知会员服务
98+阅读 · 2020年5月22日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
117+阅读 · 2020年5月6日
【论文扩展】欧洲语言网格:概述
专知会员服务
6+阅读 · 2020年3月31日
德勤:2020技术趋势报告,120页pdf
专知会员服务
187+阅读 · 2020年3月31日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
105+阅读 · 2019年6月21日
Reddit热议:70多个图分类论文+实现大汇总!
新智元
3+阅读 · 2019年7月17日
教你打造一个属于自己的「搜索引擎」
少数派
9+阅读 · 2018年10月23日
我是一个爬虫
码农翻身
12+阅读 · 2018年6月4日
教你用机器学习匹配导师 !(附代码)
数据派THU
3+阅读 · 2018年5月17日
ROS 2正式版终于来了,还增加了这些新特性
量子位
3+阅读 · 2017年12月11日
AdarGCN: Adaptive Aggregation GCN for Few-Shot Learning
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Arxiv
5+阅读 · 2018年10月11日
Arxiv
3+阅读 · 2018年8月17日
Arxiv
3+阅读 · 2018年6月1日
VIP会员
相关VIP内容
【Manning新书】现代Java实战,592页pdf
专知会员服务
98+阅读 · 2020年5月22日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
117+阅读 · 2020年5月6日
【论文扩展】欧洲语言网格:概述
专知会员服务
6+阅读 · 2020年3月31日
德勤:2020技术趋势报告,120页pdf
专知会员服务
187+阅读 · 2020年3月31日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
105+阅读 · 2019年6月21日
相关资讯
Reddit热议:70多个图分类论文+实现大汇总!
新智元
3+阅读 · 2019年7月17日
教你打造一个属于自己的「搜索引擎」
少数派
9+阅读 · 2018年10月23日
我是一个爬虫
码农翻身
12+阅读 · 2018年6月4日
教你用机器学习匹配导师 !(附代码)
数据派THU
3+阅读 · 2018年5月17日
ROS 2正式版终于来了,还增加了这些新特性
量子位
3+阅读 · 2017年12月11日
Top
微信扫码咨询专知VIP会员