博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用redis完成自动补全搜索功能(三)
阅读量:4687 次
发布时间:2019-06-09

本文共 1876 字,大约阅读时间需要 6 分钟。

  前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例。当然最好还是用搜索分词解决,这个只是一个临时解决方案。

其实加上搜索很简单,要做的就是3件事 

  1. 分词的时候,把有用词的id存进hash.

  2. 每次搜索的关键词,如果存在的自增

  3. 通过关键词把hash里的 id取出,然后通过id查询数据库即可。

dist.php 分词

'花讯','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表,用来存储idif (!empty($arr)) { array_walk($arr,function(&$v,$k){ $v = join(',',$v); }); Cache::getInstance()->hMset("search:ids",$arr);}echo 'ok';

search.php

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

  

转载于:https://www.cnblogs.com/loveyouyou616/p/5464112.html

你可能感兴趣的文章
64款工具,总有合适您的那款
查看>>
我的第一篇博客
查看>>
大数据学习线路整理
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
关于ProjectServer定制化项目中心页面
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>
润乾报表 动态控制文本的显示
查看>>
[oracle] 如何使用myBatis在数据库中插入数据并返回主键
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>