写点什么

Reddit 搜索模块发展简史

  • 2017-09-20
  • 本文字数:2215 字

    阅读完需:约 7 分钟

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 )关注我们。

2017-09-20 19:001681
用户头像

发布了 322 篇内容, 共 135.9 次阅读, 收获喜欢 144 次。

关注

评论

发布
暂无评论
发现更多内容

客户案例|华律网,通过观测云大幅缩短故障定位时间

观测云

tauri+vue开发跨操作系统的桌面应用

字母哥哥

rust Vue tauri

小程序多种开发方式对比-跨端?低代码?原生?还是云开发?

字母哥哥

小程序

java Reactive Streams响应式流式编程

字母哥哥

Java 响应式编程

解读《深入理解计算机系统(CSAPP)》第2章 信息的表示和处理

小明Java问道之路

好书推荐 csapp 信息处理 7月月更 好书解读

Java 代码中数字中间带下划线是几个意思

HoneyMoose

玩转Sonar

sean77

每日一题——PAT乙级1002题

武师叔

7月月更

Http响应头处理

急需上岸的小谢

7月月更

docker镜像分层原理及容器写时复制

字母哥哥

Docker 镜像

kafka批量发送数据源码解析

字母哥哥

kafka 消息队列 源码解读

【刷题记录】3. 无重复字符的最长子串

WangNing

7月月更

LinkedBlockingQueue源码分析-新增和删除

zarmnosaj

7月月更

九章云极DataCanvas公司摘获「第五届数字金融创新大赛」最高荣誉!

九章云极DataCanvas

创新 数字金融 九章云极DataCanvas

AIRIOT助力城市管廊工程,智慧物联守护城市生命线

AIRIOT

低代码 物联网 低代码,项目开发

应用实践 | 数仓体系效率全面提升!同程数科基于 Apache Doris 的数据仓库建设

SelectDB

数据库 数据仓库 架构演进 Doris

C++中的STL库函数之万能图——map

KEY.L

7月月更

Java多线程案例之任务定时执行器

未见花闻

7月月更

九章云极DataCanvas公司获评36氪「最受投资人关注的硬核科技企业」

九章云极DataCanvas

人工智能 投资人 36氪 九章云极DataCanvas 硬科技

浅尝不辄止系列之试试腾讯云的TUIRoom(上)

为自己带盐

7月月更 TUIRoom

Java 6 压缩字符串(Compressed String)

HoneyMoose

消息队列与快递柜之间妙不可言的关系

字母哥哥

消息队列

Java 9 缩小字符串( Compact String)

HoneyMoose

Meta Force原力元宇宙系统开发佛萨奇模式

薇電13242772558

智能合约

大话云原生之灰度发布篇-从步行到坐缆车的自动化服务升级

字母哥哥

灰度发布 #Kubernetes#

redis你到底懂不懂之list

zxhtom

7月月更

Binder核心API

北洋

binder 7月月更

Linux的小知识-curl命令

技术小生

Linux curl 7月月更

聊聊 Dart 的空安全 (null safety) 特性

岛上码农

flutter ios 安卓 跨平台开发 7月月更

第四期SFO销毁,Starfish OS如何对SFO价值赋能?

BlockChain先知

5G NR 系统消息

柒号华仔

5G 7月月更

Reddit搜索模块发展简史_语言 & 开发_Reddit_InfoQ精选文章