利用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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现