1. 程式人生 > >詳談京東的商品搜尋系統架構設計

詳談京東的商品搜尋系統架構設計

京東商品搜尋引擎是搜尋推薦部自主研發的商品搜尋引擎,主要功能是為海量京東使用者提供精準、快速的購物體驗。雖然只有短短几年的時間,我們的搜尋引擎已經經過了多次618店慶和雙11的考驗,目前已經能夠與人們日常使用的如谷歌、百度等全文搜尋引擎相比,我們的產品與其有相通之處,比如涵蓋億級別商品的海量資料、支援短時超高併發查詢、又有自己的業務特點:

  1. 海量的資料,億級別的商品量;
  2. 高併發查詢,日PV過億;
  3. 請求需要快速響應。

搜尋已經成為我們日常不可或缺的應用,很難想象沒有了Google、百度等搜尋引擎,網際網路會變成什麼樣。京東站內商品搜尋對京東,就如同搜尋引擎對網際網路的關係。

他們的共同之處:1. 海量的資料,億級別的商品量;2. 高併發查詢,日PV過億;3. 請求需要快速響應。這些共同點使商品搜尋使用了與大搜索類似的技術架構,將系統分為:1. 離線資訊處理系統;2. 索引系統;3. 搜尋服務系;4.反饋和排序系統。

同時,商品搜尋具有商業屬性,與大搜索有一些不同之處:1. 商品資料已經結構化,但散佈在商品、庫存、價格、促銷、倉儲等多個系統;2. 召回率要求高,保證每一個正常的商品均能夠被搜尋到;3. 為保證使用者體驗,商品資訊變更(比如價格、庫存的變化)實時性要求高,導致更新量大,每天的更新量為千萬級別;4. 較強的個性化需求,由於是一個相對垂直的搜尋領域,需要滿足使用者的個性化搜尋意圖,比如使用者搜尋“小說”有的使用者希望找言情小說有的人需要找武俠小說有的人希望找到勵志小說。

另外不同的人消費能力、性別、對配送時間的忍耐程度、對促銷的偏好程度以及對屬性比如“風格”、“材質”等偏好不同。以上這些需要有比較完善的使用者畫像系統來提供支援。

總體架構圖

搜尋服務叢集:由很多個merger節點組成的叢集。接收到查詢query後,將請求通過qp觸發有策略地下發到線上檢索服務叢集和其他服務叢集,並對各個服務的返回結果進行合併排序,然後呼叫detail server包裝結果,最終返回給使用者。

query processor server:搜尋query意圖識別服務。

線上檢索服務叢集:由很多個searcher節點組成,每個searcher列對應一個小分片索引(包含全量資料和實時增量資料)。

detail server:搜尋結果展示服務。

索引生產端:包含全量和增量資料生產,為線上檢索服務叢集提供全量索引和實時索引資料。

離線資訊處理系統

由於商品資料分佈在不同的異構資料庫當中有KV有關係型資料庫,需要將這些資料抽取到京東搜尋資料平臺中,這分為全量抽取和實時抽取。

對於全量索引,由於商品資料散佈於多個系統的庫表中,為了便於索引處理,對多個系統的資料在商品維度進行合併,生成商品寬表。然後在資料平臺上,使用MapReduce對商品資料進行清洗,之後進行離線業務邏輯處理,最終生成一份全量待索引資料。

對於實時索引,為了保證資料的實時性,實時呼叫各商品資訊介面獲取實時資料,將資料合併後採用與全量索引類似的方法處理資料,生成增量待索引資料。

索引系統

此係統是搜尋技術的核心,在進入這個系統之前,搜尋資訊仍然是以商品維度進行儲存的。索引系統負責生成一種以關鍵字維度進行儲存的資訊,一般稱之為倒排索引。

此係統對於全量和增量的處理是一致的,唯一的區別在於待處理資料量的差異。一般情況下,全量資料索引由於資料量龐大,採用Hadoop進行;實時資料量小,採用單機進行索引生產。

搜尋服務系統

搜尋服務系統是搜尋真正接受使用者請求並響應的系統。這個系統最初只有1列searcher組成線上檢索服務。由於使用者體驗的需要,首先增加Query Processor服務,負責查詢意圖分析,提升搜尋的準確性。隨著訪問量的增長,接著增加快取模組,提升請求處理效能。接著隨著資料量(商品量)的增長,將包裝服務從檢索服務中獨立出去,成為detail server服務。資料量的進一步增長,對資料進行類似資料庫分庫分表的分片操作。這時候,線上檢索服務由多個分片的searcher列組成。自然而然,需要一個merger服務,將多個分片的結果進行合併。至此,搜尋基礎服務系統完備。

之後,無論是搜尋量的增長或者資料量的增長,都可以通過擴容來滿足。對於618、1111之類的搜尋量增長,可通過增加每個searcher列伺服器的數量來滿足。而對於商品資料的不斷增加,只需要對資料做更多的分片,相應地增加searcher列來滿足。

搜尋服務系統內部的處理流程如下:

在這個流程中,快取模組和拉取結果模組非常穩定。而排序模組和線上業務邏輯處理模組經常需要改動。架構需要穩定,高效和通用。排序業務特點是實驗模型多,開發迭代速度快,講求效果。為了解決這一衝突,需要將排序業務與架構分離,以動態連結庫的方式整合到搜尋整體架構中,具體包括文字策略和其他策略兩個維度的相關性,文字策略相關性整合在searcher當中;其他策略相關性(包括反饋,個性化和業務調權等等)整合在merger當中。實現架構與排序業務各司其職,互不影響干擾。

反饋和排序系統反饋系統主要包含使用者行為資料的實時收集、加工,並將資料儲存到資料集市當中,並對這些資料進行特徵提取,排序最主要考核的線上指標是UV價值和轉化率,所以還會利用這些資料根據優化目標構建起標註資料。然後基於機器學習的排序系統會針對特徵構建出模型。京東排序模型是每天更新的訓練之前大概半年的資料。京東搜尋在基於模型的排序基礎之上,上層還會有一層規則引擎,比如保障店鋪和品牌的多樣性,以及京東戰略扶持的品牌等都通過業務引擎來實現。一般基於機器學習的排序模型需要較長期的投入但是模型更加健壯不容易被作弊手段找到漏洞,並且可以讓轉化率和UV價值可持續的提升。 規則引擎主要是為了快速反應市場。

針對雙11的效能優化

1.故障秒級切換

今年搜尋叢集做到了三機房部署,任何一個機房出現斷網、斷電等問題可以秒級將流量切換到其它機房。並且搜尋的部分應用部署到了彈性雲上,可以進行動態擴容。

2.大促期間索引資料實時更新

每年大促由於商品內容等資訊更改頻繁,涉及千萬級的索引寫操作,今年針對索引結構進行了調整徹底消滅掉了索引更新存在的一切鎖機制,商品新增和修改操作變為鏈式更新。使大促期間商品的索引更新達到了妙極。

3.大促期間的個性化搜尋不降級

往年大促期間由於流量在平時5倍以上,高峰流量會在平時的7倍,為了保障系統穩定,個性化搜尋都進行了降級處理。今年針對搜尋的快取進行了針對性的優化,實現了三級快取結構。從底向上分別是針對term的快取,相關性計算快取和翻頁快取。最上層的翻頁快取很多時候會被使用者的個性化請求擊穿,但是底層的相關性快取和term快取的結果可以起到作用,這樣不至於使CPU負載過高。

 京東在電商搜尋方面產品和技術的創新

1、個性化搜尋

個性化之前的搜尋對於同一個查詢,不同使用者看到的結果是完全相同的。這可能並不符合所有使用者的需求。在商品搜尋中,這個問題尤為特出。因為商品搜尋的使用者可能特別青睞某些品牌、價格、店鋪的商品,為了減少使用者的篩選成本,需要對搜尋結果按照使用者進行個性化展示。

個性化的第一步是對使用者和商品分別建模,第二步是將模型服務化。有了這兩步之後,在使用者進行查詢時,merger同時呼叫使用者模型服務和線上檢索服務,使用者模型服務返回使用者維度特徵,線上檢索服務返回商品資訊,排序模組運用這兩部分資料對結果進行重排序,最後給使用者返回個性化結果。

2、整合搜尋

使用者在使用搜索時,其目的不僅僅是查詢商品,還可能查詢服務、活動等資訊。為了滿足這一類需求,首先在Query Processor中增加對應意圖的識別。第二步是將服務、活動等一系列垂直搜尋整合並服務化。一旦QP識別出這類查詢意圖,就條用整合服務,將對應的結果返回給使用者。

3、情感搜尋

情感搜尋在於儘可能滿足更多的搜尋意圖,這需要在後臺構建一個強大的知識庫體系。比如從海里評論中挖掘有意義的標籤“成像效果好的相機”、“聚攏效果好的胸罩”、“適合送丈母孃”等,將這些資訊一同構建到索引中去比如搜尋“適合送基友的禮物”結合搜尋意圖分析相關的結果可以搜尋出來。另外也可以從外部網站抓取有價值資訊輔助構建知識庫體系。

4、影象檢索

很多時候使用者並不知道如何描述一個商品。通過搜尋意圖分析、情感分析可以儘可能挖掘搜尋意圖,很多時候使用者根本無法描述,比如在超市看到一個進口食品或者一件時尚的衣服,可以通過拍照檢索迅速在網上找到並比較價格,另外看到同事穿著一件比較喜歡的衣服也可以通過拍照檢索來找到。目前京東正在開始展開這方面的開發。離線方面主要通過CNN演算法,對圖片進行主題提取、提取相似特徵、相同特徵提取。引擎端主要是和搜尋引擎類似的技術。影象搜尋未來將可以開闢一個新的電商購物入口。京東目前正在研發新的影象檢索引擎。