Facebook 工程总监 Lars Rasmussen 介绍图谱搜索产品开发过程

  • 郑柯

2013 年 1 月 16 日

话题:FacebookDevOps语言 & 开发架构

2013 年 1 月 16 日,Facebook 发布了图谱搜索(Graph Search)的 beta 版该,产品可以让用户按照自己的关系图谱搜索内容。Las Eilstrup Rasmussen 是 Facebook 的工程总监,他在自己的日志上介绍了图谱搜索的开发历程。

Las 首先指出了该产品的独特之处:

它可以让你以全新的方式,发掘你的朋友和其他人在 Facebook 上分享的内容。使用图谱搜索,你只要输入类似短语:“我住在旧金山的朋友”,“我的家人在哥本哈根拍的照片”,或是“我朋友喜欢的牙科医生”,Facebook 就能很快展示出你请求的内容。

Las 提到:图谱搜索在一年多前就是 Facebook 搜索团队的主要目标,但项目的起源要从 Facebook 早年间说起。

人们能搜索基本信息,比如朋友、小组、活动,但是支撑这些搜多的系统不够强大,它们也不能随着网站的发展而扩展。

随着内容越来越多,Las 和团队认识到:想得到需要的结果,越来越困难,等待时间也越来越长。

接下来,他回顾了图谱搜索的开端:

在 2011 年,Zuck 要求搜索团队设计、构建一个全新系统,要具备搜索整个社交图谱的能力。这是个有趣的挑战,因为与 Web 这样的海量文本集合相比,我们数据库里面的数据要更具结构性,不像自由流动的文本那么简单。因此,传统的关键字搜索产品可能无法满足要求。

当时,他们的争论在于:在开始时,是否应该开发针对特定用例(比如招聘搜索,或本地搜索)的小型产品。这样的产品易于理解,而且可以帮团队为开发更大规模产品积累经验。但是,他们的最终选择是:

出于最彻底的黑客精神,我们决定一干到底:我们能否开发出一个单一的、结构化的搜索机制,既可以让人们搜索社交图谱上的一切,又能随着 Facebook 不可思议的成长而扩展?我们必须找到答案。

Las 接下来指出:

这样的产品同时带来两个挑战:这样的产品会是什么样子?我们需要构建什么样的基础架构来支持它?

对于产品的原型部分,Las 的团队开发了多种简单的图形化原型,让用户以点击的方式,逐步完成结构化的、数据库式的查询。但都因为过于复杂被他们否决,而且也不能满足 Zuck 给他们提供的挑战。

接下来,新的思路出现了:

新的想法来自于 Facebook 每个页面的标题,我们希望人们能构建他们自己感兴趣的特定内容的视图。如果一个用户只是输入他想找的内容,我们能否构建一个系统来理解用户的输入并找到响应的内容?

这样的内容能完美整合 Facebook 现有的搜索机制,因为用户要做的,还是在每个页面上方输入搜索意向。

一周左右,我们几个人完成一个简单的概念原型:初级的、指数级的“解析器”,用 JavaScript 写成,可模拟我们希望完成的体验,只要输入的内容不超过几个标志字符。我记得我们拿给 Zuck 看的时候,那是在 2011 年夏天。他说:“你们不可能做出那样的东西,但如果你们能做出来,那就牛掰了。”(Zuck 知道如何激励人……)

Las 的团队从未有类似产品开发经验,因此他们看了很多书。

我们组合了很多解析技术,构建出一个字符串解析器。假设用户输入:“friends New York",对此,我们已经定义了一个所有可能的页面集合,而且系统可以处理这样的集合。我们的解析器接下来就可以生成图谱搜索的标题,其中包含用户的输入,包括“friends who lived in New York"和“friends who have visited New York"。如果我们能找到一种方式来为这些建议的标题排名,就算有了一个好的开端。

又过了一个多月开发,我们有了一个原型,让我们有信心足以构建今天发布 beta 版本的这个系统。

接下来,Las 介绍了该产品的基础架构。

搜索团队的系统工程师致力于开发必须的架构。

头号挑战:每个月,有超过 10 亿人使用 Facebook,他们分享超过 2400 亿张图片,并在几千种不同类型的内容间构建超过 1 万亿连接。每天,人们分享几十亿新内容,图谱搜索需要在这些内容创建后几秒内就建立起针对它们的索引。

其次,我们运行这么多服务,还要写很多代码。在 Facebook 我们以最快速度前进,常常构建针对特定用例的基础设施和架构。坚信:公司相当程度上的成功,都依赖这些。但是背后要付出代价:从我们开始图谱搜索项目时,搜索团队负责维护三个独立的搜索系统,支持站点上诸多搜索功能,这些功能都是我们过去几年开发的。维护压力已经占用了相当多很有限的工程工作时间,要加入第四个系统,看起来不是什么好主意。我们极度需要把系统都整合起来。

当然,还要解决图谱搜索需要回答的特定搜索查询。使用传统的信息存取系统,来混合关键字和结构化查询,这已经熟烂于心了。但是我们需要系统找到的答案不仅限于单一关联,比如“restaurants liked by my friends from India”。我们运气不错:三个已有系统中的 Unicorn,就是专门为这个设计的。

搜索基础架构团队决定采取两个步骤:

首先,扩展 Unicorn,管理所有现有的搜索体验,并满足图谱搜索的所有需求。今天,我们已经足以上线图谱搜索 beta 版本。但是,我们还没有能力索引用户在 Facebook 上分享的所有帖子和评论,这个数据集是我们为了图谱搜索和 Unicorn 所积累的最大的数据集。团队会在工程团队博客上撰写更多关于这个问题的内容。

Las 接下来还谈到图谱搜索的未来:

今天只是开始,我们开始把更多注意力放在人、照片、地点和兴趣上,但是希望寻找方法整合帖子和开放图谱动作,同时,让图谱搜索在移动终端和所有语言中都可以使用。我们很兴奋,能让搜索变得更有用、有趣,同时致力于让用户发掘现有关系中,以及在 Facebook 上建立新关系。

最后,Las 号召大家都去尝试图谱搜索的 beta 版本

InfoQ 中文站的读者们,你们有谁翻墙用过这个产品了么?感觉如何?欢迎在评论中留下你们的使用感受。

FacebookDevOps语言 & 开发架构