如果老板扔一個需求:做個搜索的功能。作為一名產品經理,千萬不要只畫一個搜索框、一個“搜索”按鈕,然后交給開發:一周內把這個功能做出來! 一頭霧水的程序猿問:搜索的結果該怎么呈現?結果該怎么排序? 作為功能的設計者,如果你沒深入的思考搜索功能的產品邏輯,被鄙視、被噴、被嘲諷在所難免!
那搜索功能的原理是怎樣的呢?
對用戶來說,在什么情況下需要搜索呢?根據實際使用場景,無非兩種:1.用戶明確知道自己要什么內容,直奔主題快速搜索自己想要的內容;2.不清楚或者大致知道自己想要什么內容,通過搜索篩選出自己目標內容。不管何種場景,搜索滿足了用戶快速尋找自己感興趣內容的需求。用戶輸入一個query,一般系統會做出如下的處理流程:
? ? ? 第一步:系統對用戶輸入的信息進行解讀
? ? ? 第二步:根據用戶輸入信息對內容進行篩選
? ? ? 第三步:對篩選的結果進行排序
這是三個步驟是搜索機制的核心,可以通過服務端和系統的角度對搜索的原理進行解讀。我們先看一下數據的存儲邏輯:以一個電商平臺的搜索功能舉例來說,平臺內會有多種分類或品牌,如下:
數據庫的存儲結構就是類似于這個樣子的,左邊就是所謂的“詞庫”:只要一次搜索的輸入詞能匹配到詞庫,就可以快速的查找詞庫到對應的內容;右邊就是具體的內容索引庫。這種搜索模式就像圖書館的索引結構,一步一步的引導,找出用戶想要的內容。所以用一句話歸納:一個系統詞庫,一個內容索引庫,而且詞庫和索引庫是相互關聯的。
?根據這個原理,我們對上面的搜索核心步驟一步步進行解讀。
?第一步:系統對用戶輸入的信息進行解讀
通過詞庫找與之對應的內容,再把內容呈現給用戶,這當然是一個比較理想的狀態。但現實問題來了,我們系統不可能限制用戶的輸入行為,而我們系統的詞庫是有限的。比如,用戶輸入“我的滑板鞋子”,系統里不可能有這個詞,直接的結果就是搜索結束,用戶搜不到自己想要的結果。對于這種特殊情況,怎么才能展現結果呢?那就是分詞!? ?何為分詞,就是把用戶輸入的關鍵詞(字符串)進行拆分,比如用戶輸入的“我的天啊鞋子”可以進行如下拆分:“我的” ?“滑板鞋”,經過這樣的處理,用戶非標準的query就變成了標準的詞庫,可以進行下一步的流程處理了。
?第二步:根據用戶輸入信息對內容進行篩選
對用戶的query進行解讀之后,會得到一些標準化的詞,這些詞會對應一些內容,接下來就是對內容進行篩選了,對內容的篩選會涉及到兩個概念:召回率和準確率,看如下矩陣:
準確率指的是搜到內容中相關內容的比例;召回率指的是搜索到內容中,真正被搜索出來的比例。這兩個指標的比例越靠近1,效果越好,但是有些情況下,準確率和召回率是一組相互矛盾的指標,比如我們只搜索出一個搜索結果,且是正確的,那準確率就達到了100%,但是召回率卻很低。這兩個概念在搜索優化中是關鍵性指標,涉及到更高級的搜索機制,這里不做深入探討。這里需提醒一點,不是所有包含用戶query關鍵詞的結果都應該被召回。
?第三步:對搜索的結果進行排序
其實搜索的邏輯應該是通用的:用戶輸入一個文本(字符串),該文本會轉化為標準詞庫中的詞,搜索系統根據每個具體內容是否包含這些詞來決定是否展示這些內容,同時搜索系統根據文本的相關性給這些展示的內容一個分數,分數的高低決定的排序的先后。
因此,對搜索結果進行排序十分關鍵,排序位置的高低決定了點擊率、轉化率等一系列關鍵性運營指標,很顯然排序越靠前的結果更容易獲得用戶的點擊。好的搜索不僅僅是把應該搜索的內容盡可能的搜索出來,同時還要考慮應該把容易吸引用戶的內容展示在前面。但是如何對篩選出來的內容進行排序呢?這里涉及到了較復雜的算法規則。
下面這個Lucene的核心排序公式的原理,有專業文章詳細介紹:
當然還有很多這種公式的變形式,所有的變形式都基于這個準則:賦予每個因子不同的權重,所賦予權重的值直接影響排序的先后。如搜索出來的商品,價格、銷量等元素都可作為排序的因子,如果把“銷量”這個因子賦予較高的權重,那么銷量較大的商品搜索出來會靠前。當然,對某個因子賦權的大小視業務的需求而定。
搜索的原理基本是這樣的,其中涉及到的一些復雜算法不在此篇文章的探討范圍之內,也無法進行深度探討。了解了搜索的原理,下次我們設計搜索系統、碰到搜索相關的功能時,腦子里就會有一個清晰的邏輯。原理了解了,那設計搜索功能還會遇到一些搜索的交互以及界面細節問題,下回找時間寫一篇文章介紹如何對搜索功能進行界面設計以及用戶體驗提升的細節。