![](/2022/11/06/%E6%96%B0%E7%89%88%E7%9A%84%E6%99%AF%E9%BB%9E%E6%90%9C%E5%B0%8B%E5%8A%9F%E8%83%BD%E8%A6%81%E4%B8%8A%E7%B7%9A%E4%BA%86%EF%BC%81/search.png)
自從 POI Bank 從三年多前上線以來,使用者一直詬病的兩欄位搜尋,操作體驗真的很差。因為一開始要先用 autocomplete 選擇要找的 city,然後再輸入關鍵字送出,與大家習慣直接在一個輸入框裡面就能搜尋的方式,實在差異很大,所以一直被使用者抱怨很難用!
經過了半年斷斷續續的開發,將近 200 個 commit 之後,POI Bank 總算要升級了,當然一樣是 Android 先上線,iOS 及 Web 隨後就會跟上了。新版的搜尋只需要一個欄位就能找到大部分的景點,這裡就來分享一下新版的搜尋是如何實作的。
舊版搜尋到底遇到什麼問題?
- 一定要先選擇城市才能用關鍵字搜尋
- Elasticsearch index 維護不方便
- 很難找到熱門景點
第一點是要最先解決的問題,其實江湖一點訣,搜尋最重要的就是斷詞,所以把關鍵字先用全世界的城市斷詞,簡單來說「東京晴空塔」當然要先用中文斷詞,把關鍵字斷成「東京 (城市)」和「晴空塔 (關鍵字)」。
不過由於原本 POI Bank 的 city 資料都是官方名稱,「東京」的官方名稱是「東京都」,這樣子斷詞當然是無法斷出正確的結果。所以一定要加別名,這樣子斷詞才會正確,這就是考驗基礎資料收集的功力了,也著實花了我們不少功夫。
另外,如果使用者輸入的關鍵字 (如:牛肉麵) 無法判斷出地點的話,就只能拿畫面上的中心點來搜尋附近的景點了。
當然除了基本斷詞之外,判斷出正確的語言也是一個非常重要的課題。因為判斷錯誤語言的話,就像是拿英文斷詞器斷中文關鍵字一樣,會斷出詞不達意的結果,「東京晴空塔」會被斷成「東」、「京」、「晴」、「空」、「塔」,搜尋出的結果當然會差個十萬八千里。
不過就如同之前文章所提到的,這實在是個很難的題目。根據 Elasticsearch 部落格所寫的,一般使用者在搜尋時輸入的關鍵字長度平均為 2.4 個字 (word) (2001 年的調查),即使過了 20 年到現在,大家搜尋的關鍵字長度依然很短。而且許多判斷語言的演算法,都建議至少要 50 個字元 (character) 以上,判斷起來效果才會比較好。
而中日文因為有漢字的問題,又更難分辨了。所以目前看到建議的解決方式,在搜尋時一樣是針對全部語言,只是把能判斷出或使用者目前語言的權重高一點,這樣搜尋出來的結果會比較好。還是大家有什麼好方式,也歡迎提供給小編參考一下。
今天就寫到這邊,剩下兩個問題再另開新文章來分享!