PHP+redis实现超迷你全文检索
2014年10月31日 11:45:39
情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗时又费眼
效果: 输入"三国"或者"国三", 将自动列出所有包含"三国"的游戏名字, 输入不限顺序; 例如输入"杀三国",仍然会将"三国杀"这款游戏找出来
实现: 我用redis的集合+PHP的array_intersect()和mb系列函数, 实现了一个超迷你的全文检索功能
原理: (大道不过两三言,说穿不值一文钱,哈哈)
1, 将所有的游戏名字读出来,拆分成单个汉字
2, 将这些汉字作为redis集合的键,写入redis,每个集合里的值是所有那些游戏名字中包含此汉字的游戏的id
3, 当用户输入文字的时候通过ajax异步请求,将用户输入传给PHP
4, 将输入的文字拆分成单个汉字, 分别找到这些汉字在redis中的集合值
5, 取出来,求交集,就找到了同时包含这几个汉字的游戏的id
6, 最后到数据库里查出来相应的游戏信息即可
缺点: 删除数据不方便
PHP写入redis和检索的代码:
1 //自动补全 2 //不限输入汉字的前后顺序: 输入"国三杀" => 输出 "三国杀" 3 function getAutoComplate() 4 { 5 //$word = $this->input->post('word'); 6 $word = '三国'; 7 if (empty($word)) { 8 exit('0'); 9 } 10 $intWordLength = mb_strlen($word, 'UTF-8'); 11 12 $this->load->library('iredis'); 13 if (1 == $intWordLength) { 14 $arrGid = $this->iredis->getAutoComplate($word); 15 } else { 16 $arrGid = array(); 17 for ($i=0; $i < $intWordLength; $i++) { 18 $strOne = mb_substr($word, $i, 1, 'UTF-8'); 19 $arrGidTmp = $this->iredis->getAutoComplate($strOne); 20 $arrGid = empty($arrGid) ? $arrGidTmp : array_intersect($arrGid, $arrGidTmp); //求交集,因为传入的参数个数不确定,因此不能直接求交集 21 } 22 } 23 24 $arrGame = $this->gamemodel->getGameNameForAutoComplate($arrGid); 25 // var_dump($arrGame);exit; 26 $jsonGame = json_encode($arrGame); 27 exit($jsonGame); 28 } 29 30 //自动补全, 建立索引 31 function setAutoComplate() 32 { 33 $arrGame = $this->gamemodel->getAllGameNameForAutoComplate(); 34 $arrIndex = array(); 35 foreach ($arrGame as $gid => $gname) { 36 $intGnameLength = mb_strlen($gname, 'UTF-8'); 37 for ($i=0; $i < $intGnameLength; $i++) { 38 $strOne = mb_substr($gname, $i, 1, 'UTF-8'); 39 $arrIndex[$strOne][] = $gid; 40 } 41 } 42 43 $this->load->library('iredis'); 44 foreach ($arrIndex as $word => $arrGid) { 45 foreach ($arrGid as $gid) { 46 $this->iredis->setAutoComplate($word, $gid); 47 } 48 } 49 50 }
操作redis的方法
1 //自动补全功能 2 public function setAutoComplate($key, $value) 3 { 4 $youxikey = 'youxi_'.$key; 5 $this->sAdd($youxikey, $value); 6 } 7 8 //自动补全功能 9 public function getAutoComplate($key) 10 { 11 $youxikey = 'youxi_'.$key; 12 return $this->sMembers($youxikey); 13 }
Finger PHP 框架
转载于:https://www.cnblogs.com/iLoveMyD/p/4064704.html
PHP+redis实现超迷你全文检索相关推荐
- AServer - 基于Asp.net core Kestrel的超迷你http服务器
AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ...
- 稚晖君又整活啦!基于全志F1C200s的超迷你
转自全志在线 B站最强小电视(基于全志H3) 钢铁侠机械臂 曾经靠着"B站最强小电视"以及号称"钢铁侠机械臂"等硬核产品出圈的稚晖君又双叒叕来整活啦! 稚晖君B ...
- 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了
写在开头 如何系统,全面,的学习redis呢? 我的一个程序员朋友,在之前有面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis 的,他都差点都忘记了自己应聘的是 Java 工程 ...
- 《成功的原则》超迷你探险系列动画
由于读者对<原则>的反响非常热烈,我将这本600多页的书制作成了一个30分钟的超迷你探险系列动画--<成功的原则>. <成功的原则>超迷你探险系列共三十分钟,分八集 ...
- Linux-C 编程 / 网络 / 超迷你的 web server
一.为生活寻找固定的支撑点 1. 什么是生活的支撑点? 让自己感到些许痛苦,但却会带来实实在在的充实感和成就感的事情. 举个栗子,我的支点是运动.看书.研究技术. 2. 固定的支撑点很重要: 三个固定 ...
- 程序员自制超迷你智能NFC名片:一张平平无奇的门禁卡,如何变身为用不起的样子?...
Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 转自:机器之心 一款火柴盒大小的电子卡片,集公司工牌 ...
- 技术宅自制超迷你智能NFC名片:一张平平无奇的门禁卡,如何变身为用不起的样子?...
机器之心报道 参与:蛋酱 有一说一,头发多的程序员要是熬夜搞起手工来,效率高的可怕. 一款火柴盒大小的电子卡片,集公司工牌.小区门禁卡.食堂饭卡于一身,到哪儿都能刷.奇怪,竟然也没人拦. 最近,B 站 ...
- NFC怎么复制房卡_技术宅自制超迷你智能NFC名片:一张平平无奇的门禁卡,如何变身为用不起的样子?...
机器之心报道 参与:蛋酱 有一说一,头发多的程序员要是熬夜搞起手工来,效率高的可怕. 一款火柴盒大小的电子卡片,集公司工牌.小区门禁卡.食堂饭卡于一身,到哪儿都能刷.奇怪,竟然也没人拦. 最近,B 站 ...
- 【七】springboot整合redis(超详细)
springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合token(超 ...
最新文章
- 【Verilog HDL 训练】第 10 天(PWM 呼吸灯)
- 信息学奥赛一本通 1412:二进制分类 | OpenJudge NOI 1.13 36:二进制分类
- ArcGIS利用数据驱动工具条批量出图(python代码)
- 红帽:IaaS与PaaS齐头并进
- 缓存热点问题解决方案
- 190421每日一句
- hit网络安全实验报告
- FileUtils常用方法 - commons-io常用工具类
- win10开启Linux蓝屏,win10启动蓝屏_Win10怎么开启蓝屏记录
- python实现网络爬虫下载天涯论坛帖子
- 新版本vivado打开老工程ip核被锁住的解决方法
- Affine set 和 convex set 的定义
- 外贸软件对出口公司的作用
- 电力系统非线性控制_第二届电气,控制,自动化和机器人国际学术会议 (ECAR2020)...
- python软件安装教程-Python-中文版软件安装包以及安装教程
- 网吧XP无盘系统集成优化及母盘封装
- 抖音xgorgon及设备参数生成算法
- 我们一起聊聊数据库的可观测性
- java咖啡标志_50个包含咖啡的创意LOGO设计
- Python爬取云南统计局数据报表
热门文章
- brad wu_一百万归功于Brad Traversy
- three.ar.js_我们如何通过AR.js使产品吉祥物栩栩如生
- 计算机本科学位有用吗_我应该回到学校获得计算机科学学位吗?
- 算法的sound和complete
- 1033 旧键盘打字
- 活动排序工具之双代号网络(AOA)与单代号网络(AON)[cont.]
- hung-yi lee_p18_图神经网络(cont.)
- 用 Handler 轻松实现专属Android定时器
- linux 在执行命令过程中,反单引号(`)这个符号代表的意义为何?
- selenium grid2 使用远程机器的浏览器