最近要做一个搜索自动补全的功能(目前只要求做最前匹配),自动补全就是自动提示,类似于搜索引擎,再上面输入一个字符,下面会提示多个关键词供参考,比如你输入 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开头的字符串,通过程序循环判断即可。

      

 foreach($lsit as $val){
if (strpos($val,'nb') !== false)
break;
}

  2.上图可以看到取到了非有用的字符串, nb ,比较接单的解决方案就是 写入redis之前给有用的字符串结果拼上一个标识符,例如*

   

  取出来程序判断最后一个字符如果为*保留即可

参考文档:http://oldblog.antirez.com/post/autocomplete-with-redis.html

利用redis完成自动补全搜索功能(一)的更多相关文章

  1. 利用redis完成自动补全搜索功能(三)

    前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例.当然最好还是用搜索分词解决,这个只是一个临时解决方案. 其实加上搜索很简单,要做的就是3件事 1. 分词的时候,把有用词的id存 ...

  2. 利用redis完成自动补全搜索功能(二)

    前面介绍了自动完成的大致思路,现在把搜索次数的功能也结合上去.我采用的是hash表来做的,当然也可以在生成分词的时候,另外一个有序集合来维护排序, 然后2个有序集合取交集即可.这里介绍hash的方式来 ...

  3. C++ tab键实现自动补全输入功能

    一.简介 由于项目中写了个测试的控制台程序,是每次读取一行,即通过getline()来实现的,所以每次必须输入全路径名称,才能实现运行. 大家都觉得麻烦,就写了个tab键自动选择补全的. 目前基本可实 ...

  4. linux下让irb实现代码自动补全的功能

    我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:requir ...

  5. 各大搜索引擎智能提示API(JSONP跨域实现自动补全搜索建议)

    ---------------------------------------搜索引擎JSONP接口--------------------------------------------- 提示:U ...

  6. 使用Redis实现中英文自动补全功能详解

    1.Redis自动补全功能介绍: ​ Redis可以帮我们实现很多种功能,今天这里着重介绍的是Redis的自动补全功能的实现.我们使用有序集合,并score都为0,这样就按元素值的字典序排序.然后我们 ...

  7. Visual Studio Code使用typings拓展自动补全功能

    转自:http://blog.csdn.net/liyijun4114/article/details/51658087 参考来源: 官方介绍: https://code.visualstudio.c ...

  8. Eclipse 自动补全功能失效解决办法及修改快捷键方法

    最近在学习Java,前段时间分盘把电脑能坏了,重装系统后发现我的Eclipse的自动补全的功能失效了,那多麻烦呀,什么都得自己打,于是百度后总结了以下解决方法: 1.点击Window-->Pre ...

  9. Shell脚本中实现自动补全功能

    对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...

随机推荐

  1. BatchNormalization批量归一化

    动机: 防止隐层分布多次改变,BN让每个隐层节点的激活输入分布缩小到-1和1之间. 好处: 缩小输入空间,从而降低调参难度:防止梯度爆炸/消失,从而加速网络收敛. BN计算公式: keras.laye ...

  2. 第13章 TCP编程(4)_基于自定义协议的多线程模型

    7. 基于自定义协议的多线程模型 (1)服务端编程 ①主线程负责调用accept与客户端连接 ②当接受客户端连接后,创建子线程来服务客户端,以处理多客户端的并发访问. ③服务端接到的客户端信息后,回显 ...

  3. git本地项目上传远程

    Git的安装就不说了. 原文:https://blog.csdn.net/zamamiro/article/details/70172900 github官网说明: …or create a new ...

  4. Jenkins邮件扩展(Email Extension插件 Windows环境)

    1.Jenkins ver. 2.107.3版本自带Email Extension插件启动后即可看到系统设置里的 Extended E-mail Notification ,如果没有请安装 2.安装过 ...

  5. uva-10167-枚举

    题意:生日蛋糕上面有2N草莓,怎么切能够将蛋糕和草莓平分成俩份,直接枚举,A和B,草莓不能落在直线上 #include <iostream> #include <stdio.h> ...

  6. spring mvc 解决json 不能转换的问题

    在要转的实体上加一个 @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" ...

  7. mysql 存储过程实例

    --存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数 create procedure p_procedurecode(in sumdate varchar(1 ...

  8. VB6 如何创建一个标准控制台程序

    打开 VB6 并新建一个标准EXE程序,把窗口删掉,然后再加入一个模块. 在模块中加入AllocConsole.FreeConsole.SetConsoleTitle.Sleep的API声明: Pub ...

  9. UI5-文档-导航栏

    UI5-文档-1-前言 UI5-文档-2-开发环境 UI5-文档-2.1-使用OpenUI5开发应用 UI5-文档-2.2-使用SAP Web IDE开发应用程序 UI5-文档-2.3-使用SAPUI ...

  10. spring boot 测试类

    import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.Logge ...