摘要: 搜索是一種非常普遍而通用的服務(wù)滤灯。不同的搜索服務(wù)有著共同基礎(chǔ)技術(shù)(倒排索引,文本相關(guān)性等)遥皂,但對(duì)于特定領(lǐng)域也有著很明顯的差別力喷。電商搜索是搜索服務(wù)的一種,電商搜索面向的對(duì)象主要是商品演训,其目的是讓用戶更快的找到滿意的商品弟孟。本文介紹淘寶搜索、京東搜索样悟、1號(hào)店搜索的架構(gòu)拂募,總結(jié)電商搜索系統(tǒng)的架構(gòu)特點(diǎn)。
關(guān)鍵詞: 搜索引擎窟她、電商搜索陈症、系統(tǒng)架構(gòu)
電商搜索引擎的特點(diǎn)
- 電商搜索引擎要處理的原始數(shù)據(jù)本身就是結(jié)構(gòu)化的,通常來(lái)自于數(shù)據(jù)庫(kù)震糖,且有多個(gè)數(shù)據(jù)源录肯。相比與傳統(tǒng)的搜索引擎,電商搜索在數(shù)據(jù)采集方面更側(cè)重于各種數(shù)據(jù)源的數(shù)據(jù)更新吊说。
- 就是電商搜索引擎的過(guò)濾功能其實(shí)比搜索功能要常用论咏。甚至大于搜索本身。電商搜索面對(duì)的通常是商品名稱颁井,而商品名稱是一個(gè)短文本標(biāo)題厅贪,很難從文本相關(guān)性方面得到非常明顯的差異。
- 電商搜索引擎支持各種維度的排序雅宾,包括支持好評(píng)养涮、銷量、評(píng)論眉抬、價(jià)格等屬性的排序贯吓。而且對(duì)數(shù)據(jù)的實(shí)時(shí)性的要求非常高。電商搜索對(duì)數(shù)據(jù)的實(shí)時(shí)性要求主要體現(xiàn)在價(jià)格和庫(kù)存兩個(gè)方面蜀变。
- 電商搜索引擎的效果不僅要考慮買家(信息消費(fèi)方宣决,結(jié)果多樣性),還得考慮賣家(信息提供方昏苏,爆光率)
淘寶搜索引擎架構(gòu)
淘寶搜索引擎從索引到搜索和排序都是自主構(gòu)建、實(shí)現(xiàn)的,在整體架構(gòu)上相對(duì)比較復(fù)雜贤惯。下面從搜索分層洼专、實(shí)時(shí)更新、SKU 搜索三個(gè)角度分析淘寶搜索引擎的特點(diǎn)孵构。
搜索分層
思路 :根據(jù)商品質(zhì)量屁商,可以分為 good 和 bad 兩種類型。預(yù)先將商品分類為 good 和 bad颈墅,然后建索引的時(shí)候分別建在不同的索引之中蜡镶。檢索的時(shí)候,先從 good 索引中檢索信息恤筛,如果 good 索引返回足夠多的結(jié)果官还,則不從 bad 索引中檢索,如果 good 索引中返回的結(jié)果不夠毒坛,再?gòu)?bad 索引的查找結(jié)果補(bǔ)充望伦。整體體思想是數(shù)據(jù)預(yù)處理和分而治之。
如上圖所示煎殷,這是最原始的搜索架構(gòu)屯伞,商品不做任何分類處理,每個(gè)查詢都需要遍歷整個(gè)大集群的所有商品豪直。
如上圖所示劣摇,根據(jù)商品質(zhì)量分類的思路,可以在建索引的時(shí)候?qū)⑸唐贩譃楦哔|(zhì)量商品和低質(zhì)量商品弓乙,分別放在不同的集群之中末融,搜索的時(shí)候先從高質(zhì)量集群中檢索,高質(zhì)量集群沒(méi)有滿足結(jié)果再?gòu)牡唾|(zhì)量集群檢索結(jié)果進(jìn)行補(bǔ)充唆貌。
可以注意到滑潘,上圖中還有維度1集群、維度2集群锨咙、維度3集群這樣的分布语卤。原因在于,商品按質(zhì)量分層部分解決了機(jī)器數(shù)量多與查找范圍廣的問(wèn)題酪刀,仍沒(méi)有解決索引結(jié)構(gòu)單一與支持排序算法種類少的問(wèn)題粹舵。對(duì)于常用且需要大量計(jì)算的排序比如人氣排序,可以將這些排序中規(guī)則中質(zhì)量較高的商品放到一個(gè)單獨(dú)的索引和集群中去骂倘,這樣可以加快某些排序規(guī)則的檢索效率眼滤。
- 索引商品的順序不再受原始鏈的影響,可以靈活的采用自己特定排序方式历涝,可使用的排序方案就會(huì)變多诅需。
- 單獨(dú)特定排序的集群的倒排鏈中得分高的商品在前面漾唉,得分低的在后面,檢索算法很容易做動(dòng)態(tài)截?cái)嘌咚床辉傩枰暾牟檎艺麄€(gè)鏈赵刑。
由此可以看出,淘寶搜索對(duì)索引的遍歷是順序遍歷场刑,在假定索引有序的情況下般此,只需順序查找取回所需的條目數(shù)就行了,不需要完全遍歷牵现。相對(duì)整個(gè)大的索引集群铐懊,這種索引可認(rèn)為是一種支持模糊查詢的緩存。問(wèn)題:如何高效的維護(hù)一個(gè)有序的索引結(jié)構(gòu)瞎疼?
經(jīng)過(guò)以上步驟科乎,參與檢索的商品信息分布如上圖所示:高質(zhì)量與低質(zhì)量集群索引的商品是沒(méi)有交集,按檢索條件和排序規(guī)則創(chuàng)建的商品索引是有交集的丑慎,即存在數(shù)據(jù)冗余喜喂,但這個(gè)冗余是可以接受的。
最后整個(gè)的分層搜索架構(gòu)如下圖所示
總結(jié): 淘寶的分層搜索基于數(shù)據(jù)預(yù)處理和分而治之的思想竿裂,在整個(gè)大集群上面構(gòu)建了一些不同角度不同維度的小集群玉吁,分散流量,從而達(dá)到節(jié)省硬件資源的情況下提高檢索效率腻异。
實(shí)時(shí)更新
上圖中標(biāo)五角星的是實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)更新进副、實(shí)時(shí)干預(yù)結(jié)果的重要模塊
PORA:PORA是搜索離線團(tuán)隊(duì)針對(duì)實(shí)時(shí)個(gè)性化業(yè)務(wù)場(chǎng)景打造的一套離線實(shí)時(shí)計(jì)算系統(tǒng)。高效的完成數(shù)據(jù)分析和數(shù)據(jù)同步悔常。
UPS:UPS是搜索技術(shù)部門提供個(gè)性化服務(wù)存儲(chǔ)計(jì)算的在線系統(tǒng)影斑,承擔(dān)了包括搜索個(gè)性化在內(nèi)的眾多業(yè)務(wù)線上全量實(shí)時(shí)KV/KKV數(shù)據(jù)的低延遲的存儲(chǔ)、查詢和計(jì)算服務(wù)机打。在本次雙11實(shí)時(shí)流量調(diào)控中矫户,UPS在提供用戶個(gè)性化數(shù)據(jù)等原有服務(wù)的基礎(chǔ)上還存儲(chǔ)了PORA實(shí)時(shí)更新的流量調(diào)控?cái)?shù)據(jù),供下游天貓雙11直播間使用残邀。
Isearch5: ISearch5是搜索最新一代引擎平臺(tái)皆辽,服務(wù)于淘寶、天貓芥挣、B2B等各個(gè)搜索業(yè)務(wù)線驱闷,支持秒級(jí)實(shí)時(shí)索引、輔表等眾多新特性空免。在本次雙11實(shí)時(shí)流量調(diào)控中空另,PORA產(chǎn)出的實(shí)時(shí)售罄率和轉(zhuǎn)化率字段正是通過(guò)Swift消息實(shí)時(shí)更新的索引字段。ISearch5引擎中還包含一個(gè)戰(zhàn)馬框架可以支持嵌入算法的排序模塊蹋砚,算法在對(duì)應(yīng)的流量調(diào)控排序模塊中可以獲取到PORA實(shí)時(shí)更新至引擎的售罄率和轉(zhuǎn)化率字段值扼菠,從而實(shí)時(shí)影響排序結(jié)果摄杂,達(dá)到調(diào)控流量的目的。
SP :SP是搜索面向前端應(yīng)用的統(tǒng)一服務(wù)接口循榆,根據(jù)用戶指定的查詢條件制定查詢計(jì)劃匙姜,查詢包括QP/UPS,ISearch5引擎在內(nèi)的各個(gè)搜索后端系統(tǒng)冯痢,得到最終結(jié)果返回個(gè)前端。SP通過(guò)將業(yè)務(wù)邏輯從前端往后端下沉框杜,簡(jiǎn)化了搜索調(diào)用邏輯浦楣,提升了前端系統(tǒng)性能。
BTS 服務(wù):BTS是搜索的分桶測(cè)試管理服務(wù)咪辱,搜索的一次服務(wù)首先從BTS中獲得自己所屬的測(cè)試振劳,BTS確保一個(gè)用戶的前后多次訪問(wèn)獲取到的始終是相同結(jié)果,測(cè)試信息作為一個(gè)查詢條件通過(guò)SP傳給后端各個(gè)系統(tǒng)油狂,后端據(jù)此可以進(jìn)行分桶測(cè)試历恐。具體到本次雙11的實(shí)時(shí)流量調(diào)控需求,引擎的戰(zhàn)馬框架中配置的算法排序模塊會(huì)根據(jù)傳入測(cè)試信息不同進(jìn)行不同權(quán)重的流量調(diào)控排序专筷,從而幫助算法對(duì)比和優(yōu)化模型弱贼。
總結(jié):淘寶搜索支撐實(shí)時(shí)數(shù)據(jù)實(shí)時(shí)干預(yù)主要是通過(guò)強(qiáng)大的離線計(jì)算系統(tǒng)和高性能的消息中間件,同時(shí)索引文檔支持 按字段更新磷蛹,提高索引更新效率吮旅。
SKU 搜索
通常搜索是以商品為單位,但商品信息具體到 SKU 上還是有區(qū)別(比如 iPhone 5s味咳,白色的 16G iPhone 5s)庇勃。
SKU 搜索要解決數(shù)據(jù)冗余問(wèn)題,因?yàn)?SKU 信息和商品信息有很多重合的地方槽驶。淘寶的解決辦法是以商品信息為主表责嚷,抽離的 SKU 信息為子表,同時(shí)查詢主表和子表掂铐,然后根據(jù)主表到子表的轉(zhuǎn)換公式罕拂,完成結(jié)果的去重和過(guò)濾。
這實(shí)際上是一對(duì)多的關(guān)系堡纬。一個(gè)商品信息文檔對(duì)應(yīng)多個(gè) SKU 信息文檔聂受。
淘寶搜索引擎架構(gòu)總結(jié)
淘寶搜索引擎架構(gòu)具備分布式、可擴(kuò)展的特性烤镐,索引模塊蛋济、查詢模塊、排序干預(yù)模塊都實(shí)現(xiàn)了架構(gòu)上的分離炮叶,方便對(duì)各個(gè)模塊進(jìn)行單獨(dú)的優(yōu)化和改造碗旅。文檔索引支持按字段更新渡处。并且配備強(qiáng)大的消息中間件、數(shù)據(jù)實(shí)時(shí)處理系統(tǒng)祟辟。
京東搜索引擎架構(gòu)
從上圖可以看出医瘫,整個(gè)京東搜索引擎的架構(gòu)分為三大塊:
-
離線信息處理系統(tǒng)
由于商品數(shù)據(jù)分布在不同的異構(gòu)數(shù)據(jù)庫(kù)當(dāng)中有KV有關(guān)系型數(shù)據(jù)庫(kù),需要將這些數(shù)據(jù)抽取到京東搜索數(shù)據(jù)平臺(tái)中旧困,這分為全量抽取和實(shí)時(shí)抽取醇份。
對(duì)于全量索引,由于商品數(shù)據(jù)散布于多個(gè)系統(tǒng)的庫(kù)表中吼具,為了便于索引處理僚纷,對(duì)多個(gè)系統(tǒng)的數(shù)據(jù)在商品維度進(jìn)行合并,生成商品寬表拗盒。然后在數(shù)據(jù)平臺(tái)上怖竭,使用MapReduce對(duì)商品數(shù)據(jù)進(jìn)行清洗,之后進(jìn)行離線業(yè)務(wù)邏輯處理陡蝇,最終生成一份全量待索引數(shù)據(jù)痊臭。
對(duì)于實(shí)時(shí)索引,為了保證數(shù)據(jù)的實(shí)時(shí)性登夫,實(shí)時(shí)調(diào)用各商品信息接口獲取實(shí)時(shí)數(shù)據(jù)广匙,將數(shù)據(jù)合并后采用與全量索引類似的方法處理數(shù)據(jù),生成增量待索引數(shù)據(jù)悼嫉。 -
索引系統(tǒng)
此系統(tǒng)是搜索技術(shù)的核心艇潭,在進(jìn)入這個(gè)系統(tǒng)之前,搜索信息仍然是以商品維度進(jìn)行存儲(chǔ)的戏蔑。索引系統(tǒng)負(fù)責(zé)生成一種以關(guān)鍵字維度進(jìn)行存儲(chǔ)的信息蹋凝,一般稱之為倒排索引。
此系統(tǒng)對(duì)于全量和增量的處理是一致的总棵,唯一的區(qū)別在于待處理數(shù)據(jù)量的差異鳍寂。一般情況下诫硕,全量數(shù)據(jù)索引由于數(shù)據(jù)量龐大硫眯,采用hadoop進(jìn)行砰苍;實(shí)時(shí)數(shù)據(jù)量小课竣,采用單機(jī)進(jìn)行索引生產(chǎn)。 -
搜索服務(wù)系統(tǒng)
搜索服務(wù)系統(tǒng)是搜索真正接受用戶請(qǐng)求并響應(yīng)的系統(tǒng)弛作。由于用戶體驗(yàn)的需要初肉,首先增加Query Processor服務(wù)厢钧,負(fù)責(zé)查詢意圖分析专酗,提升搜索的準(zhǔn)確性睹逃。隨著訪問(wèn)量的增長(zhǎng),接著增加緩存模塊,提升請(qǐng)求處理性能沉填。接著隨著數(shù)據(jù)量(商品量)的增長(zhǎng)疗隶,將包裝服務(wù)從檢索服務(wù)中獨(dú)立出去,成為detail server服務(wù)翼闹。數(shù)據(jù)量的進(jìn)一步增長(zhǎng)斑鼻,對(duì)數(shù)據(jù)進(jìn)行類似數(shù)據(jù)庫(kù)分庫(kù)分表的分片操作。這時(shí)候猎荠,在線檢索服務(wù)由多個(gè)分片的searcher列組成坚弱。自然而然,需要一個(gè)merger服務(wù)关摇,將多個(gè)分片的結(jié)果進(jìn)行合并史汗。至此,搜索基礎(chǔ)服務(wù)系統(tǒng)完備.
除了以上三大模塊拒垃,京東搜索引擎架構(gòu)還實(shí)現(xiàn)了排序與架構(gòu)的分離,排序接受反饋系統(tǒng)的實(shí)時(shí)干預(yù)
京東搜索引擎架構(gòu)的幾個(gè)特點(diǎn):
離線信息處理系統(tǒng)完成數(shù)據(jù)的整合與加工瓷蛙,索引系統(tǒng)只做數(shù)據(jù)的索引和更新悼瓮。
徹底消滅掉了索引更新存在的一切鎖機(jī)制,商品新增和修改操作變?yōu)殒準(zhǔn)礁录桠J股唐沸畔⒏念l繁横堡,涉及千萬(wàn)級(jí)索引寫操作的大促期間,商品的索引更新達(dá)到秒級(jí)冠桃。
對(duì)搜索的緩存進(jìn)行了針對(duì)性的優(yōu)化命贴,實(shí)現(xiàn)了三級(jí)緩存結(jié)構(gòu)。從底向上分別是針對(duì)term的緩存食听,相關(guān)性計(jì)算緩存和翻頁(yè)緩存胸蛛。最上層的翻頁(yè)緩存很多時(shí)候會(huì)被用戶的個(gè)性化請(qǐng)求擊穿,但是底層的相關(guān)性緩存和term緩存的結(jié)果可以起到作用樱报,這樣不至于使CPU負(fù)載過(guò)高葬项。
1號(hào)店搜索引擎特點(diǎn)
1號(hào)店搜索引擎架構(gòu)相較與淘寶和京東的搜索引擎架構(gòu)沒(méi)有太大的突破。但也基于 Lucene迹蛤,自主實(shí)現(xiàn)了索引模塊民珍、查詢模塊和排序模塊,實(shí)現(xiàn)了架構(gòu)上的模塊分離盗飒。1號(hào)店搜索引擎的特點(diǎn)在于高效的 Sharding 和 Routing 的設(shè)計(jì)嚷量。
按照類目來(lái)切分 Shard 的策略∧嫒ぃ基本操作為:
按照一級(jí)類目切分 Shard蝶溶。
如果該 Shard 過(guò)大,則按照二級(jí)類目繼續(xù)切分汗贫。
經(jīng)過(guò)前兩步之后身坐,如果切分后的 Shard 過(guò)小秸脱,則按照相關(guān)性進(jìn)行 Shard 合并。
按照搜詞和類目做 Routing 策略部蛇。
對(duì)于類目導(dǎo)航摊唇,原理上非常簡(jiǎn)單,按照類目ID來(lái)查找 Sharding 策略涯鲁,就可以確定需要訪問(wèn)的 Shard巷查,雖然現(xiàn)實(shí)中還需要考慮擴(kuò)展類目等特殊場(chǎng)景,但是也不難做出一個(gè)簡(jiǎn)單的 Routing 策略抹腿。再加上類目數(shù)是有限的岛请,Routing 規(guī)則在 Broker 本地內(nèi)存就可以緩存起來(lái)。
搜詞場(chǎng)景復(fù)雜很多警绩,僅憑詞本身很難判斷它屬于哪個(gè)Shard崇败。解決辦法是首先按照詞的熱度分為兩類,采取不同的 Routing 策略肩祥。對(duì)于熱詞后室,搜詞流量同樣符合80-20規(guī)則,20%的熱詞占比80%的搜索流量混狠,對(duì)于熱詞岸霹,可以在建完索引之后,就跑一遍熱詞搜索将饺,記錄哪些 Shard 有結(jié)果贡避,離線構(gòu)建出熱詞 Routing 表。切換索引時(shí)予弧,Routing 表也一起加載進(jìn)去刮吧。對(duì)于非熱詞,則采用首次搜索去訪問(wèn)所有 Shard掖蛤,根據(jù)結(jié)果記錄 Routing 表皇筛,這個(gè)詞在下次搜索時(shí),就有了緩存可用坠七。
總之水醋,基于豐富的 Sharding 和 Routing 規(guī)則,減少每次檢索需要查詢的數(shù)據(jù)量彪置。
電商搜索引擎架構(gòu)總結(jié)
要做好一個(gè)電商搜索引擎拄踪,主要需要解決一下幾個(gè)問(wèn)題:
- 信息處理系統(tǒng)。索引文檔的預(yù)處理過(guò)程拳魁,可靠的索引數(shù)據(jù)來(lái)源惶桐。
- 數(shù)據(jù)更新問(wèn)題。強(qiáng)大可靠的消息中間件推送,索引文檔支持不加鎖更新(字段更新)姚糊。
- 密集流量的響應(yīng)處理(緩存贿衍,Routing),減輕全量索引的查詢壓力救恨。
- 易于擴(kuò)展排序算法干預(yù)贸辈,與業(yè)務(wù)相關(guān)的排序處理與搜索基礎(chǔ)組件的分離。算法設(shè)計(jì)者無(wú)需關(guān)心數(shù)據(jù)來(lái)源問(wèn)題肠槽。
- 分布式索引和查詢擎淤,提高搜索引擎的可擴(kuò)展性。
從以上幾個(gè)問(wèn)題出發(fā)秸仙,可以發(fā)現(xiàn)淘寶搜索引擎嘴拢、京東搜索引擎和1號(hào)店搜索引擎的架構(gòu)都基于相同的模式,只是側(cè)重點(diǎn)各有不同寂纪。但都本著模塊分離原則席吴,每個(gè)模塊做好自己的事情,模塊之間協(xié)作捞蛋,從而提高搜索引擎系統(tǒng)的效率抢腐。