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实现超迷你全文检索相关推荐

  1. AServer - 基于Asp.net core Kestrel的超迷你http服务器

    AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ...

  2. 稚晖君又整活啦!基于全志F1C200s的超迷你

    转自全志在线 B站最强小电视(基于全志H3) 钢铁侠机械臂 曾经靠着"B站最强小电视"以及号称"钢铁侠机械臂"等硬核产品出圈的稚晖君又双叒叕来整活啦! 稚晖君B ...

  3. 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了

    写在开头 如何系统,全面,的学习redis呢? 我的一个程序员朋友,在之前有面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis 的,他都差点都忘记了自己应聘的是 Java 工程 ...

  4. 《成功的原则》超迷你探险系列动画

    由于读者对<原则>的反响非常热烈,我将这本600多页的书制作成了一个30分钟的超迷你探险系列动画--<成功的原则>. <成功的原则>超迷你探险系列共三十分钟,分八集 ...

  5. Linux-C 编程 / 网络 / 超迷你的 web server

    一.为生活寻找固定的支撑点 1. 什么是生活的支撑点? 让自己感到些许痛苦,但却会带来实实在在的充实感和成就感的事情. 举个栗子,我的支点是运动.看书.研究技术. 2. 固定的支撑点很重要: 三个固定 ...

  6. 程序员自制超迷你智能NFC名片:一张平平无奇的门禁卡,如何变身为用不起的样子?...

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 转自:机器之心 一款火柴盒大小的电子卡片,集公司工牌 ...

  7. 技术宅自制超迷你智能NFC名片:一张平平无奇的门禁卡,如何变身为用不起的样子?...

    机器之心报道 参与:蛋酱 有一说一,头发多的程序员要是熬夜搞起手工来,效率高的可怕. 一款火柴盒大小的电子卡片,集公司工牌.小区门禁卡.食堂饭卡于一身,到哪儿都能刷.奇怪,竟然也没人拦. 最近,B 站 ...

  8. NFC怎么复制房卡_技术宅自制超迷你智能NFC名片:一张平平无奇的门禁卡,如何变身为用不起的样子?...

    机器之心报道 参与:蛋酱 有一说一,头发多的程序员要是熬夜搞起手工来,效率高的可怕. 一款火柴盒大小的电子卡片,集公司工牌.小区门禁卡.食堂饭卡于一身,到哪儿都能刷.奇怪,竟然也没人拦. 最近,B 站 ...

  9. 【七】springboot整合redis(超详细)

    springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合token(超 ...

最新文章

  1. 【Verilog HDL 训练】第 10 天(PWM 呼吸灯)
  2. 信息学奥赛一本通 1412:二进制分类 | OpenJudge NOI 1.13 36:二进制分类
  3. ArcGIS利用数据驱动工具条批量出图(python代码)
  4. 红帽:IaaS与PaaS齐头并进
  5. 缓存热点问题解决方案
  6. 190421每日一句
  7. hit网络安全实验报告
  8. FileUtils常用方法 - commons-io常用工具类
  9. win10开启Linux蓝屏,win10启动蓝屏_Win10怎么开启蓝屏记录
  10. python实现网络爬虫下载天涯论坛帖子
  11. 新版本vivado打开老工程ip核被锁住的解决方法
  12. Affine set 和 convex set 的定义
  13. 外贸软件对出口公司的作用
  14. 电力系统非线性控制_第二届电气,控制,自动化和机器人国际学术会议 (ECAR2020)...
  15. python软件安装教程-Python-中文版软件安装包以及安装教程
  16. 网吧XP无盘系统集成优化及母盘封装
  17. 抖音xgorgon及设备参数生成算法
  18. 我们一起聊聊数据库的可观测性
  19. java咖啡标志_50个包含咖啡的创意LOGO设计
  20. Python爬取云南统计局数据报表

热门文章

  1. brad wu_一百万归功于Brad Traversy
  2. three.ar.js_我们如何通过AR.js使产品吉祥物栩栩如生
  3. 计算机本科学位有用吗_我应该回到学校获得计算机科学学位吗?
  4. 算法的sound和complete
  5. 1033 旧键盘打字
  6. 活动排序工具之双代号网络(AOA)与单代号网络(AON)[cont.]
  7. hung-yi lee_p18_图神经网络(cont.)
  8. 用 Handler 轻松实现专属Android定时器
  9. linux 在执行命令过程中,反单引号(`)这个符号代表的意义为何?
  10. selenium grid2 使用远程机器的浏览器