利用redis完成自動補全搜索功能(一)


最近要做一個搜索自動補全的功能(目前只要求做最前匹配),自動補全就是自動提示,類似於搜索引擎,再上面輸入一個字符,下面會提示多個關鍵詞供參考,比如你輸入 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM