最近要做一個搜索自動補全的功能(目前只要求做最前匹配),自動補全就是自動提示,類似於搜索引擎,再上面輸入一個字符,下面會提示多個關鍵詞供參考,比如你輸入 nb 2字符, 會自動提示nba,nba錄像,nba直播 。
能想到的一般有3種解決方案
1.利用mysql來做,只能使用 like 'nb%'這樣的方式來完成,雖然最前匹配是能夠利用到索引的,但是這種做法效率太低.。
2.利用搜索分詞來實現,比如sphinx ,訊搜,elasticsearch , 一般都是采用此方案。
3.網上查了下,通過redis的有序集合也能實現。
我們這里講解redis的方法,思路如下
1.先把每個詞拆分出來,如果 nba 拆分為
n
nb
nba
加入到有序集合(sorted set),注意添加到redis時score都設置為0,這些字符就會按照自然排好序。
注意:這里把score為0是非常有用的,可以試驗下,然后看下排序的結果。
好了,准備工作完了,進行下一步,搜索以nb開頭的 ,我們可以通過zrank命令輕松定位到nb的位置(index),然后通過index獲取從nb開頭的有序集合。
如果圖已經獲取到想要結果,如果取到不為nb開頭的字符串,通過程序循環判斷即可。
1 foreach($lsit as $val){ 2 if (strpos($val,'nb') !== false) 3 break; 4 }
2.上圖可以看到取到了非有用的字符串, nb ,比較接單的解決方案就是 寫入redis之前給有用的字符串結果拼上一個標識符,例如*
取出來程序判斷最后一個字符如果為*保留即可
參考文檔:http://oldblog.antirez.com/post/autocomplete-with-redis.html