zoukankan      html  css  js  c++  java
  • 利用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

  • 相关阅读:
    http://blog.csdn.net/steveguoshao/article/details/38414145
    http://www.tuicool.com/articles/EjMJNz
    http://jingyan.baidu.com/article/7f41ecec1b7a2e593d095ce6.html
    Linux 查看当前时间和修改系统时间
    http://m.blog.csdn.net/article/details?id=49132747
    http://www.cnblogs.com/nick-huang/p/4848843.html
    javaScript事件(一)事件流
    jQuery选择器
    超链接a的target属性
    html基础总结版
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/5461752.html
Copyright © 2011-2022 走看看