伍哥原創之豆莢商城商品搜索架構介紹

豆莢商城(www.dou55.com)商品搜索架構介紹php

1,需求分析html

伍哥所在的豆莢商城是一個家電行業的B2C網上零售平臺。做爲這樣一個平臺,天然少不了一個強大並且快速的商品搜索功能啦。這個搜索的功能最基本的 一個需求,就是必須可以根據用戶輸入的搜索關鍵詞,返回相關的結果,並且相關度越高的結果應該排的越靠前。因此通常的數據庫查詢,好比like,就沒法滿 足這樣的需求了。第二個基本的需求是快速,一個查詢總不能讓用戶等幾秒纔出結果吧,那樣用戶早不耐煩跑啦。mysql

2,搜索架構分析sql

基於以上兩個基本的要求,通過方案的比對,最後定了使用sphinx(獅身人面像!)來作這個搜索子系統。其實sphinx自己也提供了兩種經常使用的架構方式:一種是常規api查詢的方式,一種是經過在mysql裏面添加sphinxse引擎來實現。數據庫

2.1 常規api查詢的方式:api

第一步,是sphinx經過indexer索引工具對mysql相應的數據表作索引。因爲咱們的是中文數據,因此也使用了mmseg這個中文分詞工具來配合sphinx創建索引。數組

第二步,是php程序經過php版本的sphinx api,向sphinx發送查詢請求(具體是searchd這個進程)。若是查詢到結果,就會返回相應結果數組,包含了id、相關度權重、相關的一些屬性信息等等。架構

第三步,是php程序利用返回的結果,主要是id,向db查詢詳細的信息。好比查詢商品的名稱、價格、圖片等等。而後就把結果加到頁面上面來。運維

 

2.2 sphinxse引擎查詢方式:分佈式

第一步,是sphinx經過indexer索引工具對mysql相應的數據表作索引。因爲咱們的是中文數據,因此也使用了mmseg這個中文分詞工具來配合sphinx創建索引。

第二步,是php程序經過構造特別的sql,向sphinx se發送查詢請求。

第三步,是sphinx se向sphinx發送查詢請求(具體是searchd這個進程),得到id等等信息

第四步,mysql利用返回的id信息,結合sql,向php返回mysql結果集

 

2.3 兩種方式的比較:

第一種方式是靈活,之後的擴展性好,可是PHP開發量稍大,並且要求對sphinx有比較深刻的理解,特別是匹配模式、排序模式、評分模式、filter的使用和api方法。具體請參考伍哥貼的sphinx的文檔

第二種方式是php端開發簡單,可是靈活性稍顯不足。具體請參考伍哥轉載的張宴的文章

出於之後的長遠考慮,最後決定了使用第一種:api查詢方式。

 

3,搜索子系統的實現 (簡單介紹,具體實現不展開)

搜索子系統的實現其實分紅兩塊,一塊是client端的開發,主要是PHP開發工程師的工做;另外一塊server端的部署和開發,主要是運維工程師的工做。

Client端,先把子系統基本的MVC搭一下,而後把sphinx api封裝成系統的分佈式服務接口,接下來就是PHP開發工程師們的活了:學習API,在測試環境作練習,實際進行代碼開發,單元測試和調優等等。

Server端,先是把sphinx部署好,而後是作索引部分。這是大頭,也十分的重要。須要結合產品需求文檔,結合數據庫表結構,定義清楚文本字段、屬性等等,要構造主索引和增量索引,以及索引更新的規則。最後經過search這個工具進行調優。

更進一步的話,要改善搜索質量,須要研究中文分詞和mmseg,提升分詞的準確度等等。

開發和運維的工做都完成之後,兩端就作集成測試,基本完成之後,提交內部測試,進一步優化使用體驗。最後就部署上線,打完收工。

全文結束。

相關文章
相關標籤/搜索