Reddit的CTO Chris Slowe、工程副總裁Nick Caldwell和工程總監(jiān)Luis Bitencourt-Emilio在Reddit網(wǎng)站上披露了Reddit搜索模塊的發(fā)展史。以下內(nèi)容翻譯自博客內(nèi)容,查看原文The Search for Better Search at Reddit。
在過去,新來的工程師總會問:“什么時候可以把我們的搜索引擎弄好?”在今年之前,我們的答案通常是:“到5樓去問問搜索引擎團隊吧。”但實際上到5樓的電梯按鈕根本不管用,而且根本不存在什么搜索引擎團隊。
但時代在改變。我們現(xiàn)在很高興地宣布,Reddit新的搜索模塊誕生了。在過去幾周,它已經(jīng)承擔了Reddit 50%的搜索流量,提供了將近5億次搜索?,F(xiàn)在我們很有信心可以讓它承擔起100%的流量,我們也希望你們能夠喜歡這樣更快也更穩(wěn)定的搜索結(jié)果!
我們在Reddit開辟了一個與搜索相關(guān)的產(chǎn)品單元,并由工程總監(jiān)Luis領(lǐng)導(dǎo)該產(chǎn)品。我們也意識到這些技術(shù)對Reddit的未來來說是至關(guān)重要的。我們的平臺擁有世界上最有趣的內(nèi)容,包括2.5億個帖子,而且每天都在增長,但苦于難以對這些內(nèi)容進行搜索。通過改善搜索體驗,用戶就可以直接在主頁上定制想閱讀的內(nèi)容。
Reddit搜索模塊簡史做好搜索不是件輕而易舉的事情,在過去的12年中,我們的搜索架構(gòu)經(jīng)歷了6次技術(shù)棧演化。
2005年,聯(lián)合創(chuàng)始人(現(xiàn)在的CEO)Steve Huffman開始使用PostgresSQL的tsearch2。那個時候一切都還很簡單,用Postgres就足夠了。Postgres能夠做很多事情,它的觸發(fā)器真的很好用。不過它的缺點是不夠靈活,我們很快就發(fā)現(xiàn)其中的少部分搜索會影響到其他大部分的查詢操作。2007年,工程元老(現(xiàn)在的CTO)Chris Slowe使用PyLucene重新實現(xiàn)了搜索模塊。它是一個單進程的Python RPC服務(wù)器,建立在TCP之上,支持多線程。最初的版本支持搜索帖子的標題和評論,Lucene索引文件單獨保存。在這一時期我們還沒有遷移到AWS上,而且確實也考慮過使用Google Search Appliance。這一版本相對靈活,但伸縮性比較差。2008年,Reddit的三號員工(現(xiàn)在是搜索工程師)David King使用Solr重新實現(xiàn)了搜索模塊。他自己開發(fā)了一個叫作pysolr的工具,將最新的文檔通過XML格式傳給Solr,然后將響應(yīng)封裝成我們的查詢模型可以識別的格式。最初版本不支持搜索評論,不過后來支持了。2010年,David使用IndexTank代替了Solr。網(wǎng)站流量一直在增長,我們的PV達到了每月十億的級別,而我們只有四個工程師在后面支撐。我們不斷添加Postgre數(shù)據(jù)庫作為讀副本,添加緩存,還用上了早期版本的Cassandra,但是搜索體驗仍然很糟糕。2012年,LinkedIn關(guān)閉了IndexTank項目,于是Keith Mitchell開始使用CloudSearch。在LinkedIn收購IndexTank并將其關(guān)閉之后,我們不得不遷移到AWS CloudSearch上。后來我們又從舊的AWS CloudSearch遷移到新的CloudSearch上,但仍然存在性能問題,有將近三分之一的查詢無法在5秒鐘內(nèi)完成,導(dǎo)致出現(xiàn)搜索錯誤頁面。現(xiàn)在,我們使用了Lucidworks的Fusion!我們要確保搜索模塊能夠滿足三個方面的要求:快速、伸縮性和相關(guān)性。我們與來自Lucidworks的搜索專家合作,他們當中有好幾位是Solr項目的貢獻者。數(shù)據(jù)攝?。╥ngest)在進行搜索系統(tǒng)遷移的過程中,最大的挑戰(zhàn)莫過于更新索引管道了。在進行第一次嘗試時,我們?yōu)榱思涌焖俣?,直接使用了我們的遺留ETL系統(tǒng),這個系統(tǒng)由Jenkins和Azkaban組成,我們在上面運行很多Hive查詢。從下圖可以看出,將多個數(shù)據(jù)源并入單個點進行索引比我們預(yù)期的要復(fù)雜得多。
在進行第二次嘗試時,我們使用了更簡單的方案,也得到了更好的結(jié)果。我們把整個管道分成了四個簡單地Hive查詢,在索引帖子方面提升了33%的速度。另一方面,我們只索引新創(chuàng)建的帖子,同時實時地更新投票和評論的相關(guān)度。
提升相關(guān)性低相關(guān)度的搜索是沒有意義的。在發(fā)布搜索系統(tǒng)的時候,我們的主要目標就是要保證搜索結(jié)果的相關(guān)性不受影響。
我們將新系統(tǒng)和舊系統(tǒng)的搜索結(jié)果頁面的點擊率進行了對比。一個完美的搜索引擎,它提供的搜索結(jié)果(排名靠前的部分)會有100%的點擊率。當然,我們知道完美的搜索引擎是不存在的,所以我們使用Mean Reciprocal Rank和Discounted Cumulative Gain算法來對比搜索結(jié)果的質(zhì)量。
從圖中可以看出,F(xiàn)usion的線條形狀更銳利,可見我們在相關(guān)度方面還有很大提升的空間,而且可以進行個性定制、機器學(xué)習(xí)以及查詢優(yōu)化和重寫。
發(fā)布推廣在解決了數(shù)據(jù)攝取和相關(guān)度問題之后,我們要讓更多的Reddit用戶使用它。來自社區(qū)的反饋對我們來說是非常有價值的,他們發(fā)現(xiàn)了一些表層的bug和一些不常見的問題。剛開始我們只讓1%的用戶使用我們的新系統(tǒng),然后是5%、10%、25%,在發(fā)布GA版本的時候是50%。
我們可以很自信地說Reddit現(xiàn)在的搜索模塊比以往任何時候都要好。對Reddit所有的內(nèi)容進行重新索引只需要5個小時(之前是11個小時),而且我們還持續(xù)更新索引。錯誤率下降了兩個數(shù)量級,99%的搜索都能在500毫秒內(nèi)完成。機器數(shù)量從原先的200多臺下降到30多臺,我們因此節(jié)約了很多成本。
搜索的未來我們希望新的搜索模塊能夠讓大家更容易地在Reddit上找到自己感興趣的內(nèi)容。但我們不會止步于此,做好搜索只是我們邁出的第一步,我們希望在個性化和相關(guān)性方面給Reddit用戶帶來更好的體驗。