站內搜索系列:如何通過產品策略優化搜索排序結果?(內附站內搜索搭建指南)
編輯導讀:搜索是最常見的功能之一,用戶通過站內搜索幫助自己快速找到想要的內容來改善用戶體驗,促進轉化率。如何搭建一個高質量的站內搜索引擎呢?本文將從五個方面進行分析,希望對你有幫助。
一、站內搜索的意義
對于媒體內容站、電商、SaaS服務等B端企業來說,增加「站內搜索」功能來幫助自己的用戶快速找到心中所想的內容是改善用戶體驗,降低跳出率,促進用戶轉化率的最好方法。
另一方面來說,站內搜索也是幫助B端企業快速收集用戶真實想法的好工具,用戶每一次搜索和點擊,都是對自己網站內容的反饋,特別是無結果的搜索詞,更是幫助我們改善網站的至關重要的一手資料。
那么如何快速搭建起一個高質量站內搜索引擎呢? 接下來我會寫一系列文章來詳細講解站內搜索的方方面面,歡迎大家持續關注。
今天,我們先從產品層面談談如何優化搜索排序結果。
二、從初代搜索算法談起
要想深入理解搜索,要從搜索引擎的起源說起。任何一個復雜系統都是首先從一個簡單系統開始,逐漸演化而來的。而一上來就設計一個復雜系統,很難讓它良好的運轉起來。所以我們必須追根溯源,從源頭談理解搜索。
90年代,TREC(全球文本檢索大會)組織了一系列年度研討會。這次研討會主要想找到「非結構化長文檔」組成的數據集的最優搜索算法。TREC對搜索引擎算法做了非常多的優化,其中TF-IDF算法應該是當時最棒的排序算法的主要組成部分。
TF-IDF算法如它的名字一樣,含兩個關鍵要素,「詞頻TF」與「逆文檔頻率IDF」。用這兩個要素統計加權后獲得搜索排序。
- 詞頻(TF,即Term Frequency)。詞頻TF是指「搜索詞」在一篇文檔中出現的頻次。
- 逆文檔頻率(IDF,即Inverse Document Frequency)。逆文檔頻率IDF是指「搜索詞」在整個語料庫中的頻次。
當用戶鍵入一個「搜索詞」后,首先比對整個文檔庫中哪些文檔中包含的「搜索詞」最多。包含的越多,這篇文檔排名就越高。
這個簡單的規則有一個致命的問題,我們的語言中有非常多的連詞,代詞,助詞等只是用于輔助句子表達的詞。比如「嗎」、「也」、「這個」、「可是」這樣的詞,這些詞并非文檔的核心內容,應該降低權重處理。
此時,我們引入第二個關鍵要素——逆文檔頻率IDF。它的作用是降低語料庫中出現頻次多的詞的權重。一個詞在語料庫中重復出現的次數越多,包含這個「搜索詞」的文檔的排名就越低。
TF-IDF的設計是不是簡單又巧妙,TF-IDF排序算法以及類似的比如BM25算法基本上就是古早搜索引擎的查詢和排序核心算法。這類算法主要針對非結構性長文本而設計,比如大型企業文檔,歷年判案文書,全球論文檢索庫等設計。
這類算法是搜索引擎的基石,很好的理解它們的原理,有助于我們設計自己的站內搜索。接下來,我們談談針對獨立站、小程序、APP應用內搜索搜索問題應該怎么設計和處理。
三、如何通過數據屬性來優化排序結果
今天咱們不談搜索技術問題,只談站內搜索的產品設計問題。
站內搜索技術的問題其實已經被解決的很好了,開源免費的有ElasticSearch,國內SaaS形式的站內搜索解決方案也有很多,比如卡拉搜索 KalaSearch.com ,一行代碼即可部署站內搜索,非常方便。 在搜索技術不是大問題的前提下,剩下比拼的就是產品策略和產品設計。接下來,我們從產品設計層面談談如何優化搜索排序。
這種算法的問題是它只能針對極少數場景設計,并不適合當下互聯網中網站、小程序、app里的信息搜索。這種搜索會把所有文檔不分類型的混排在一起,而我們現在的數據信息包含非常多的緯度,甚至有些用戶行為投票的社交指標包含在其中,比如(瀏覽量、點贊數、轉發數等)。
如何利用多維度數據提升搜索準確度是我們要思考的問題。
前文我們提到TF-IDF類搜索算法的原理,那么接下來應該添加些什么元素使搜索引擎排序準確性上更進一步呢?我們網站/小程序/APP中的文檔信息其實并不是混排在一起的,而是包含非常多緯度的信息,甚至有一些緯度是用戶行為產生的對文檔質量的投票,比如瀏覽量,點贊數,轉發數,收藏數等。如何利用這么多豐富的多維度信息來幫助我們優化搜索呢?
一般我們可以把站內文檔信息分成這么幾個緯度。
- 搜索屬性:標題、正文、標簽、文章描述、圖片描述、評論內容等。這些屬性可以作為搜索的基礎屬性放入我們的站內搜索中。
- 人氣指標:點贊,轉發,評論,評論的點贊,收藏,關注等通過用戶的行為產生的人氣指標。這些指標可以輔助我們判斷一篇文檔的內容優質程度。
- 站長策略:作為管理員,有時候會有根據自己站的情況,手動調整的一些內容??梢哉{整這些內容的在搜索結果中的排序權重。
我們來舉個例子。假設用戶最近看了威爾·史密斯的經典電影《當幸福來敲門》,很喜歡。第二天打算去豆瓣上看看影評,但昨天看的是“幸?!笔裁磥碇??用戶只記得電影名里有個幸福,于是在豆瓣電影的搜索框輸入“幸?!薄?/p>
請思考一下這時候用戶的心理狀態。他肯定不關心到底有多少含有“幸?!边@個詞的電影名(TF詞頻),肯定也不關心“幸?!边@個詞到底是不是電影名的常見詞(逆文檔頻率IDF)。
這位用戶更關心的是怎么快速準確找到昨天看的那部叫什么“幸福”的電影,趕緊看影評。
這時候,我們的搜索引擎應該把什么排在聯想詞列表的第一位呢?
雖然《當幸福來敲門》中的「幸?!惯@個詞并非在屬性的第一個,但因為這個電影名本身權重高,所以被排在第一名。
在這個場景的搜索中,「幸?!惯@個詞,有很多屬性可供我們的搜索引擎用來做排序判斷。
- 「幸?!惯@個詞在“演員姓名”屬性中,還是在“片名”中?
- 「幸?!沟钠磳懯欠裾_?有錯別字,同音字、相似形狀的字或者南方無法分清前后鼻音的用戶輸入的詞,比如「新福」?
- 「幸?!惯@個詞在屬性中是第一個詞嗎?還是當中的一個詞。
- 含「幸?!沟膶傩灾杏卸嗌儆脩粜袨橥镀睌??比如:看過/想看/影評/以及簡評等。
- 含「幸福」的屬性包含在外部榜單中嗎?比如奧斯卡獎,金球獎等。
- 含「幸?!沟膶傩允遣皇窃诙拱觌娪白约旱恼鹃L策略中?豆瓣250電影榜等。
以上這些屬性在數值加權后,把「當幸福來敲門」排在搜索結果最前面的可能性,肯定比使用TF-IDF排序算法找到「當幸福來敲門」的可能性大得多。
所以,我們應該要把網站業務的各種屬性考慮到排序結果之中,并根據不同屬性的重要程度來設計權重。我們可以從以下幾個方面來考慮排序問題。
- 詞語匹配:如果用戶輸入多個詞,那么與用戶輸入的搜索詞匹配度最高的結果,肯定是排在最前面的。
- 相近度:詞與詞彼此靠近,排序更靠前( 搜「海底撈」,那么「海底撈自熱火鍋」應該比「海底的撈網」排名靠前 )。
- 業務屬性權重:比如剛剛豆瓣電影的例子,在這里搜索的用戶首先想找的一定是電影,其次才是電影人。比如搜「史密斯」排在第一的大概率是「史密斯夫婦」(電影名),而不應該是「威爾·史密斯」(電影人)。
- 搜索詞所屬位置:處于重要屬性中的詞,排名會更高。比如標題或描述里包含了搜索詞的文檔,排名肯定高于只有正文才有搜索詞的文檔。
- 精確性:完全匹配的精準詞,沒有任何前綴和后綴的,會排在最前面。
- 錯別字:有錯別字的文檔被認為是文檔質量低的表現之一,它不應該比沒有錯別字的文檔排的更高。
豆瓣電影輸入「史密斯」前面三位是電影,后三位是電影人,這是根據產品業務權重的搜索排序策略。
站內搜索加上這些排序策略后,比經典的搜索算法排序在搜索準確度上有了非常大的飛躍。那么,我們要怎么繼續提升排序質量呢?
接下來我們來聊聊如何靈活運用這些搜索策略來進一步改善搜索排序結果。
四、如何通過調整數據屬性的排序來優化搜索結果
現在的各種站內搜索解決方案,之所以搜索結果準確度低,問題并非出在搜索算法上。因為網站/APP再大、情況再復雜,規則也是可以窮盡的。這和全網搜索的難度相比,難度上低了無數個數量級。
那么問題出在什么地方呢?問題出在沒有或很難靈活運用搜索策略上。
如果我們用ElasticSearch搭站內搜索,那么從“搭建”到“能用”其實很簡單,但從“能用”到“好用”就得好幾個工程師+無數時間積累才行。這不是一般中小公司能夠承受的成本開支,大多數中小公司會停留在湊合能用的狀態上。
特別基本搜索算法選擇使用一個大的浮點分數,把所有東西混在一起。給每一份文檔根據所有規則加權獲得一個分數。然后根據這個規則來排序。這種方法有個有一個致命的問題,就是把完全不是一碼事的屬性混在一起談排序。
舉個例子。假設排序方案包含TF-IDF及點贊數這兩個緯度。那么問題來了,我們的搜索引擎會怎么排序?
如果某個文檔的點贊數非常高,會怎么排序?這個文檔會排在非??壳?,即便文檔與搜索詞的相關度非常之低也會被排在很靠前。
那么如果某個文檔與搜索詞相關度非常高,但點贊數為0,又會怎么排序呢? 這篇點贊為0的文章很可能都不會出現在排序結果中。
這種混合搜索排序方法的另一個問題是它的復雜性。當多個緯度的屬性被混在一個公式里,我們發現搜索結果很糟糕時,也不知道應該怎么調整。
那么,面對這種多個緯度的搜索問題,我們應該如何設計搜索排序呢?
聰明的辦法是把所有屬性拆開來看,針對自己的業務調整他們的順序即可。不把所有屬性混在一起計算大分數,而是計算N個分數,并進行N次連續排序。
接下來我來講講它的工作原理。
所有匹配結果按照第一條標準進行排序,如果有結果得分并列,則繼續根據第二條標準計算得分并排序。如果仍有并列,那么就繼續執行第三條標準,直到搜索結果中每一條都有自己的位置。
那么流程中先用哪條標準來進行判斷,成為這個排序方案的關鍵。
來個案例,你就明白了。
[
{
“title”: “為什么《黑肯帝國3》在IDBM才不到7分?”,
“featured”: true,
“number_of_likes”: 2647
},
{
“title”: “《黑客帝國》里面,為什么最后是尼歐贏了?”,
“featured”: false,
“number_of_likes”: 3077
},
{
“title”: “還好當年沒讓小李子演《黑客帝國》”,
“featured”: false,
“number_of_likes”: 531
},
{
“title”: “多年以后,才真正看懂黑各帝國”,
“featured”: false,
“number_of_likes”: 797
},
{
“title”: “如何理解《黑客帝國》?”,
“featured”: true,
“number_of_likes”: 611
}
]
為了簡化例子,我們把規則簡化成三點,錯別字,加精,點贊數這三個指標上。
用戶輸入「黑客帝國」這個關鍵詞進行查詢,他會得到如下結果。
- 如何理解《黑客帝國》? (無錯別字; 已加精; 點贊數:611)
- 《黑客帝國》里面,為什么最后是尼歐贏了? (無錯別字; 未加精; 點贊數:3077)
- 為什么《黑肯帝國3》在IDBM才不到7分?(2個錯別字; 已加精; 點贊數:2647 )
- 還好當年沒讓小李子演《黑客帝國》(無錯別字; 未加精; 點贊數:531)
- 多年以后,才真正看懂黑各帝國(1個錯別字; 未加精;點贊數:797)
給予精華更高權重。精華一般是網站管理員手動添加的,是管理員根據當下情況判別的。這種精華標記,通常情況下應該大于用戶投票行為的指標(比如點贊數)。
錯別字是判斷文檔重要程度的一個緯度,如果文檔中有錯別字,有一定概率說明文檔的質量有些問題,在排序上應該降低權重。
我們將用戶投票行為放在關鍵詞相關性之后(有時候點贊數甚至是不可信的,針對搜索引擎作弊行為最先想到的就是刷點贊數。所以搜索引擎能自定義更多緯度的判別屬性,是他是否在細節上能足夠精準的關鍵,這個問題有機會單開一篇講)。
以上是這個案例的策略,如果我們對這個例子的排序結果不滿意怎么辦?只需要調整屬性權重(順序)即可。比如我們覺得錯別字沒什么問題,不應該降權太多,那只需要把「錯別字」這個屬性放到后面即可。
國內站內搜索解決方案「卡拉搜索」策略設置后臺,只需要用鼠標拖動就可以改變屬性權重。
五、站內搜索優化總結
對于媒體內容站、電商、SaaS服務等B端企業來說,增加「站內搜索」功能來幫助自己的用戶快速找到心中所想的內容是改善用戶體驗,降低跳出率,促進用戶轉化率的最好方法。
另一方面來說,站內搜索也是幫助B端企業快速收集用戶真實想法的好工具,用戶每一次搜索和點擊,都是對自己網站內容的反饋,特別是無結果的搜索詞,更是幫助我們改善網站的至關重要的一手資料。
- 對于媒體內容站、電商、SaaS服務等B端企業來說,增加「站內搜索」是降低跳出率,促進轉化率的最好方法。
- 「站內搜索」是幫助站長理解自己用戶心中所想最好的工具,特別是收集無搜索結果的搜索詞,有助于更好的改進網站內容。
- 「站內搜索」不需要使用系數或任何形式的加權平均值方式來判別排序權重。使用復雜的公式不如使用產品策略來調整搜索結果。
- 添加更多緯度的數據給搜索引擎,讓他能更好的識別并根據這些指標來排序。
搭建「站內搜索」其實很簡單,國內比較好的站內搜索SaaS只需要一行代碼即可部署,我將在下一篇文章中講解如何快速部署站內搜索。歡迎留言提問,下一篇一并解答。
作者:蔣川,公眾號:靈感實踐
本文由 @蔣川 原創發布于人人都是產品經理,未經許可,禁止轉載。
題圖來自Unsplash,基于CC0協議。
很有幫助 謝謝作者
產品
對小白幫助很大??
廢話連篇
期待下一篇~
雖然我不會搭建,但還是看完了,搶沙發,嘻嘻嘻!
接下來我會寫從0到1手把手搭建站內搜索引擎。歡迎關注。
也歡迎關注「卡拉搜索」KalaSearch.com 一行代碼即可快速部署站內搜索/app搜索。
好的