利用redis完成自动补全搜索功能(三)
前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例。当然最好还是用搜索分词解决,这个只是一个临时解决方案。
其实加上搜索很简单,要做的就是3件事
1. 分词的时候,把有用词的id存进hash.
2. 每次搜索的关键词,如果存在的自增
3. 通过关键词把hash里的 id取出,然后通过id查询数据库即可。
dist.php 分词
<?php
require './redis.php'; //从数据库取出需要分词的数据
$words = [
['name'=>'花讯','id'=>1],
['name'=>'nba','id'=>2],
['name'=>'nba直播','id'=>3],
['name'=>'nba赛事','id'=>4],
['name'=>'nba季后赛','id'=>5],
['name'=>'nba录像','id'=>6],
['name'=>'花讯品牌','id'=>7],
['name'=>'花讯女装','id'=>8],
['name'=>'花','id'=>9],
['name'=>'n','id'=>10],
['name'=>'nba直播','id'=>11],
]; //利用管道
Cache::getInstance()->pipeline();
foreach ($words as $val) { $len = mb_strlen($val['name'],'utf-8');
for ($i=0;$i<=$len;$i++){ $key = mb_substr($val['name'],0,$i+1,'utf-8');
if ($i == $len) {
//所有相同关键词id
$arr[$key][] = $val['id']; $key .= '*';
//初始化关键词搜索次数
Cache::getInstance()->hSet("search:hits",$key,0);
}
//分词加入有序集合
Cache::getInstance()->zAdd('search',0,$key);
} }
Cache::getInstance()->exec();
unset($words); //生成有用关键词hash表,用来存储id
if (!empty($arr)) {
array_walk($arr,function(&$v,$k){
$v = join(',',$v);
});
Cache::getInstance()->hMset("search:ids",$arr);
} echo 'ok';
search.php
<?php
require './redis.php'; $key = isset($_GET['key']) ? $_GET['key'] : 'nba直' ; //如果存在 自增1
if (Cache::getInstance()->hGet("search:hits","{$key}*") !== false)
Cache::getInstance()->hIncrBy("search:hits","{$key}*",1); //关键字开头存在有序集合的位置
$index = Cache::getInstance()->zRank('search',$key);
if ($index === false)
goto END; if ($_res = Cache::getInstance()->zRange('search',$index,-1)){ foreach ($_res as $val){
if (strpos($val,$key) === 0 && strrev($val)[0] == '*'){
$arr[] = substr($val,0,-1);
}
}
//从hash表中获取id
$res = Cache::getInstance()->hMGet("search:ids",$arr); //通过id 从mysql 获取数据源
echo 'ok';
} END:
4. 前端ajax请求获取数据渲染模板
完整代码: http://files.cnblogs.com/files/loveyouyou616/search.zip
利用redis完成自动补全搜索功能(三)的更多相关文章
- 利用redis完成自动补全搜索功能(一)
最近要做一个搜索自动补全的功能(目前只要求做最前匹配),自动补全就是自动提示,类似于搜索引擎,再上面输入一个字符,下面会提示多个关键词供参考,比如你输入 nb 2字符, 会自动提示nba,nba录像, ...
- 利用redis完成自动补全搜索功能(二)
前面介绍了自动完成的大致思路,现在把搜索次数的功能也结合上去.我采用的是hash表来做的,当然也可以在生成分词的时候,另外一个有序集合来维护排序, 然后2个有序集合取交集即可.这里介绍hash的方式来 ...
- C++ tab键实现自动补全输入功能
一.简介 由于项目中写了个测试的控制台程序,是每次读取一行,即通过getline()来实现的,所以每次必须输入全路径名称,才能实现运行. 大家都觉得麻烦,就写了个tab键自动选择补全的. 目前基本可实 ...
- linux下让irb实现代码自动补全的功能
我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:requir ...
- 各大搜索引擎智能提示API(JSONP跨域实现自动补全搜索建议)
---------------------------------------搜索引擎JSONP接口--------------------------------------------- 提示:U ...
- 使用Redis实现中英文自动补全功能详解
1.Redis自动补全功能介绍: Redis可以帮我们实现很多种功能,今天这里着重介绍的是Redis的自动补全功能的实现.我们使用有序集合,并score都为0,这样就按元素值的字典序排序.然后我们 ...
- Visual Studio Code使用typings拓展自动补全功能
转自:http://blog.csdn.net/liyijun4114/article/details/51658087 参考来源: 官方介绍: https://code.visualstudio.c ...
- Eclipse 自动补全功能失效解决办法及修改快捷键方法
最近在学习Java,前段时间分盘把电脑能坏了,重装系统后发现我的Eclipse的自动补全的功能失效了,那多麻烦呀,什么都得自己打,于是百度后总结了以下解决方法: 1.点击Window-->Pre ...
- Shell脚本中实现自动补全功能
对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...
随机推荐
- js中, match和exec方法的区别
1. 来源分别为: string.match(reg) 和 RegExp.exec(str): 2. 区别 > 现有 字符串s1 和 正则对象 r1. 目标: 抽出s1中的所有电话号码 ...
- 从最大似然函数 到 EM算法详解
极大似然算法 本来打算把别人讲的好的博文放在上面的,但是感觉那个适合看着玩,我看过之后感觉懂了,然后实际应用就不会了.... MLP其实就是用来求模型参数的,核心就是“模型已知,求取参数”,模型的意思 ...
- selenium+python自动化97--unittest参数化(paramunittest)
前言 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 前面讲数据驱动的时候,用ddt可以解决多组数据传入,自动生成多个测试用例.本篇继续介绍 ...
- 地址解析协议ARP(Address Resolution Protocol)
1.引言 说明: ARP的作用,解决了什么问题: 以太网中的链路层,可能会采用不同的网络技术,而且不以ip作为路由依据. 链路层以mac地址作为路由依据. ARP的功能是在32 bit的IP地址和采用 ...
- YUM软件包额外扩展了解项
5.YUM配置文件 yum的配置一般有两种方式: 一种是直接配置/etc目录下的yum.conf文件, 另外一种是在/etc/yum.repos.d目录下增加.repo文件 [root@xuliang ...
- OpenCL 查询平台和设备
▶ 查询平台和设备的代码以结果,放在这里方便以后逐渐扩充和查询(没有营养) #include <stdio.h> #include <stdlib.h> #include &l ...
- zabbix配合脚本监控Kafka
简介: Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.Kafka如下特性,受到诸多公司的青睐. 1.高吞吐量:即使是非常普通的硬件Kafka也可以支持 ...
- 【RabbitMQ】ubuntu下RabbitMQ安装与简单使用
参考:https://blog.csdn.net/the_fool_/article/details/80570971 1.安装: https://blog.csdn.net/a295277302/a ...
- Redis 通用操作1
01, 设置值 => set key value 01.1, 设置值并添加有效期 => set key value ex 秒数 或者 set key value px 毫秒数 01.2, ...
- WDA-WebDynpro Demo & FPM Demo
Web Dynpro Demo package: SWDP_DEMO SWDP_TEST FPM Demo package: APB_FPM_DEMO APB_FPM_DEMO_SCENARIO