Suggestion(搜尋建議)產品和技術

大熊先生|網際網路後端技術發表於2016-06-15

今天來簡單聊聊Suggestion產品

什麼是Suggestion服務? 一圖勝千言:

當你想要搜尋某個長詞語或者一句話輸入部分時,Suggestion服務預測你極大可能的候選項,並羅列出來,供你選擇。

產品的意義:

1. 降低使用者搜尋的輸入成本,使用者總是懶惰的,誰能讓使用者最懶惰還能幫他把事辦好,這就是好的產品。當然如果真有一天能用腦電波搜尋了,這個產品功能就沒意義了.

2. 為使用者提供提示,因為有部分使用者多一個長片語很有可能只能記住部分。如有部電影叫"心急吃不了熱豆腐",朋友A推薦給朋友B,只記得"心急吃不了啥"了

3. 提高搜尋轉化率,使用者在任何過程中都有可能流失,打字打完"心急吃不了",一個朋友說別看這個了,看<冰與火之歌>吧,可能還差那最後3個字就能轉戰別的電影了

 

什麼樣的詞應該納入到Suggestion裡面去呢?

如果把所用所有的搜尋記錄都作為suggestion服務,那使用者輸入完一個字首後,就會出現滿屏的詞語;在這種場景下,儘量提供好用的suggestion而保持簡潔的結果的祕訣在於把控數量並提高轉化率,所以一般可以用雙重法則

1. 如果這個字首的所有搜尋詞不超過N個,按轉化概率從大到小排序

2. 如果超過N個, 放棄掉使用者轉化率小於a的搜尋詞,按轉化概率從大到小排序

 

整體技術上怎麼實現呢?

如果你在做一個Suggestion總詞語量較小的產品. (<千萬級)

短平快,直接用小指令碼掃每天的使用者搜尋日誌,然後根據策略得出整個搜尋詞表,放到Mysql中;

查詢直接用  select XXX from TABLE_XXX where SuggestionWords like {QUERY}% 進行查詢

訪問量大怎麼辦?

mysql 的查詢成為瓶頸,在前面加一層快取,來儲存結果List即可.

訪問量極大怎麼辦?

這裡極大的意思時,一瞬間的某個詞語的快取未命中(失效或者DB更新後delete)查詢會拖死Mysql

兩個思路

1. mysql加從庫 Master-Slave叢集

2. 更新時主動生成快取,讓前端查詢任何時刻都看不到快取未命中

 

如果你在做一個Suggestion總詞語量較大的產品. (>千萬級)

類似的場景我之前遇到的是百度的帳號註冊時的Suggestion, N億的註冊使用者,新使用者上來了想註冊abcd這個帳號,已經被佔用了,所以一般推薦abcd作為字首能用的帳號如abcd1,abcd11等,類似的場景如域名註冊服務商的推薦。

技術實現上可以用Tire樹,Tire樹的每個條邊就是每個詞,從非根節點到根節點經過的所有的邊組成了一個詞,如下圖的最長詞dcba

通過這種方式就能對海量基數詞進行Suggestion服務了。

另外tire樹的插入、查詢、刪除的時間複雜度都是o(N),N為待插入、查詢、刪除字串的長度。

 

相關文章