东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

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:001640
用户头像

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

关注

评论

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

Spring Boot面试题(2020最新版),2021我的Java大厂面试之旅

Java 程序员 后端

Redis入门到五大类型实现,java基础知识点大全

Java 程序员 后端

Redis高可用篇:Cluster集群能支持的数据量有多大?,再不了解你就out啦

Java 程序员 后端

RestFul API 统一格式返回 + 全局异常处理,linux系统编程视频教程

Java 程序员 后端

Servlet的Cookie和Session机制,面试谈谈对springboot的理解

Java 程序员 后端

Socket和ServerSocket的简单介绍及例子,mongodb教程导入外部数据

Java 程序员 后端

SonarQube,SonarLint检测代码修复问题汇总归纳,2021京东最新Java面试真题解析

Java 程序员 后端

Redis该怎么学?其实很简单,这份学习路线,mybatis架构梳理

Java 程序员 后端

RocketMQ 5,学习linux系统管理

Java 程序员 后端

Redis分布式基石——主从复制技术详述,Java黑科技实现原理揭秘

Java 程序员 后端

SCA Sentinel 分布式系统的流量防卫兵,春招我借这份PDF的复习思路

Java 程序员 后端

redis 在微服务领域的贡献,java制作微信小程序教程

Java 程序员 后端

Redis哨兵原理,我忍你很久了!,java面试视频百度云

Java 程序员 后端

Redis:看完就比常人多会三种类型实战,可以拿去炫耀了

Java 程序员 后端

Set集合无法去重相同内容的父类对象和子类对象的问题解决

Java 程序员 后端

set集合,挑战华为社招

Java 程序员 后端

Spring Boot核心技术之Restful映射以及源码的分析,springboot启动原理通俗

Java 程序员 后端

Spring Cloud Gateway实战之二:更多路由配置方式,阿里面试java准备

Java 程序员 后端

Redis-用的很溜,了解过它用的什么协议吗?,3天拿到网易Java岗offer

Java 程序员 后端

Redis到底能干什么?又不能干什么呢?,kettle面试题

Java 程序员 后端

Redis精通系列——LRU算法详述(Least Recently Used - 最近最少使用)

Java 程序员 后端

Redis不只是get set,八种数据类型及应用场景分析,java技术栈面试题

Java 程序员 后端

Redis总结,学Java必看书籍

Java 程序员 后端

Serverless Devs 的官网是如何通过 Serverless Devs 部署的

Java 程序员 后端

Spring Boot 项目如何做性能监控?,javase教程书

Java 程序员 后端

Redis-生产架构选型解决方案,java开发架构师

Java 程序员 后端

seata-golang 一周年回顾,java面试准备内容

Java 程序员 后端

Sleuth服务跟踪大厂高频面试题:整合-Zipkin,java面向对象程序开发及实战答案

Java 程序员 后端

SonarQube检测出的bug、漏洞以及异味的修复整理,mysql基础知识

Java 程序员 后端

Spring Boot 谷粒学院、谷粒商城项目问题汇总,springboot源码视频

Java 程序员 后端

Redis面试题汇总,mysql调优面试题

Java 程序员 后端

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