如何最佳化中日文的關鍵字搜尋 - 2

上一篇提到了 Funliday 最近如何最佳化中日文的關鍵字搜尋,其實最佳化一直都在做,但一直找不到突破口。後來是因為最近上了一個新功能,才讓最佳化有了新的發展。

大家一定都有用過搜尋引擎,搜尋完的結果頁都會將你在這篇搜尋到的關鍵字,用紅色字標示出來,這就叫 highlight。原本 Funliday 沒這個功能,有時候使用者覺得這搜尋結果怎麼這麼爛,搜尋出來的內容都不是我想要的,所以我們最近就加了這功能。

有了這功能,至少可以讓使用者在結果頁看到內容確實是有關鍵字出現,可能是在標題,也可能是在內文。一般來說,如果兩者都有符合的話應該要放最前面,第二是只有標題符合,最後則是只有內文符合。然後再加上其他的參數,比如是不是被精選過,留言數多不多…等,但這些參數不在這次的討論範圍,就不多提了。

我們在上了 highlight 功能之後,發現其實也可以拿來做為搜尋精準度的驗證。簡單說,當使用者搜尋「新竹」,結果頁可能會出現「新竹米粉」、「今天我們從台北出發去新竹玩」這類的內容,但也發現了「聖地では・・・?世界観がそのまんま!鬼滅の刃の聖地巡礼スポット11選【全国】」這類內容,而且 highlight 的部分在新聖地的「」。這實在非常奇怪,出現一篇跟「新竹」完全無關的內容,於是就開始查問題在哪裡了。

查搜尋結果當然要用 ES 的 explain 功能啦,細節就不多提了,總之後來發現是因為「新聖地では・・・?世界観がそのまんま!鬼滅の刃の聖地巡礼スポット11選【全国】」用的是日文斷詞 (kuromoji),所以「新聖地」會被斷成「、聖地」,而「新竹」會被斷成「、竹」,最後在搜尋時就比對成功了,所以要修正這個問題。


解決這個問題的做法,我們是先用 NLP 技術判斷關鍵字的語言是什麼 (「新竹」判斷為 zh),然後搜尋時決定要搜尋 title_zh 或是 title_ja,因為「新聖地…」是放在 title_ja,所以搜尋時就不會搜尋到這篇文章了。

把這個問題修正之後,其實改善了一大部分的中日文搜尋,因為之前一直都是用 title_* 來搜尋,雖然知道這樣寫效果應該蠻差的,但一直找不到方式 (也沒有花時間) 來驗證,而 highlight 這個功能幫了很多忙。其實 highlight 應該還可以做一些延伸應用,像是在每一個搜尋結果旁邊多一個按鈕,回報給 Funliday「您認為這個搜尋結果有符合你的期待嗎?」,有了使用者的回報,再加上最前面提到的參數,這樣應該能幫助搜尋做的更好。

這篇大概差不多結束啦,下一篇來分享搜尋「台北 美食」遇到的問題。


工商服務,我們在徵後端工程師啦!如果你對於開發景點資料庫 (PostgreSQL)、關鍵字搜尋 (Elasticsearch)、機器學習有興趣的話,歡迎 FB 私訊粉絲頁或直接寄信到 kewang@funliday.com 喔!