今天跑到Joyo網去看看我需要的書到貨沒有,順便搜索了一下其他書籍,我發現有自動填充,原來沒有發現呢。汗顏。
案例:
如果我輸入de,下面會有”德語“,”德川家康“等條目出現,伴隨有多個搜索結果。
問題:
Joyo是怎麼實現的呢?
分析:
當然我不可能看到其源代碼和數據庫schema。下面按照我自己的思路來解決這個問題。
首先看看Joyo網的效果:
當你輸入"de",會出現以下結果:
我們可以看到會出現以"de"發音的漢字,當然也包括英文。
當輸入"deyu"會是什麼效果呢?看圖:
這是輸入一整個”deyu"的拼音,所以下面都是以德語開頭的,當然要是下面有“德育”的,也會顯示的。
看看輸入"de yu"會是什麼效果?我猜是沒有結果。事實上也是:
這說明是中間不能有空格的,除非“德語”是“德 語”,下面才有結果。
從上面你能得出什麼結論?
我的結論是:
拼音是按照漢語的順序來的,如果有空格,那麼拼音的相應位置也有空格。例如"德語"對應是"deyu","德 語"則是"de yu"。
字母區分大小寫的。
既然有上面的結論,那麼怎麼去做呢?對於程序不大的,很簡單,直接在數據庫裡設置。
假設數據庫裡有一個表名叫item_t.之所以選擇item,那是因為Joyo買書,賣CD等各種商品,所以不能以book_t來代替。
item_t應該有如下字段:
id 每本書的id
price 每本書的價格
name 每本書的名字,是中文就是中文,是英文就是英文
name_alias 用來存儲上面的拼音的。
這裡特別要介紹一下name_alias,這個field是關鍵。在錄入的時候應該存儲相應的拼音。按照一般習慣,英文書名應該存儲英文。漢字的存儲拼音。
實現
既然有了上面的分析,還有什麼不能解決的呢。很明顯要用到ajax技術。為了查找精確,應該到name,name_alias來2個field都查詢。寫一條SQL:
SELECT id,name FROM item_t WHERE name LIKE "%keyword_you_search% OR name_alias LIKE '%keyword_you_search%'
你也許會問,這裡輸出的是整個書名啊,和輸出結果有出入。的確如此。
那麼Joyo到底是怎麼做的?我猜想她將每個用戶輸入的關鍵字都存儲起來的。這樣在查詢就方便一些。但是最終也不會離不開第一步。
引申
有人也許會問,你說的也太簡單了吧,那麼Google中國會怎麼處理呢?我也不知道。
單從Google首頁來看,其實和joyo差不多。但是有個問題是Google應該不太會用SQL Server或Oracle等數據庫的做法去存儲,因為這非常不利於查詢等操作。
所以上面的name_alias可能行不通,不然每次都需要人工去輸入,這得多大的功夫。唯一可能的就是自動去處理。
如何處理呢?最差的一種就是將每個漢字的拼音都拿出來。相信這也不是什麼難事,不然Google的輸入法是怎麼做出來的呢。
接下來的事情怎麼做,我想大家都知道。
更多
這裡不介紹Ajax的使用方法,有人可能會提到沒法輸出中文,這些都是基本知識啦,這裡不詳述。