PHP redis实现超迷你全文检索


Posted in PHP onMarch 04, 2017

情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗时又费眼

效果: 输入"三国"或者"国三", 将自动列出所有包含"三国"的游戏名字, 输入不限顺序; 例如输入"杀三国",仍然会将"三国杀"这款游戏找出来

实现: 我用redis的集合+PHP的array_intersect()和mb系列函数, 实现了一个超迷你的全文检索功能

原理: (大道不过两三言,说穿不值一文钱,哈哈)

1、将所有的游戏名字读出来,拆分成单个汉字

2、 将这些汉字作为redis集合的键,写入redis,每个集合里的值是所有那些游戏名字中包含此汉字的游戏的id

3、当用户输入文字的时候通过ajax异步请求,将用户输入传给PHP

4、将输入的文字拆分成单个汉字, 分别找到这些汉字在redis中的集合值

5、取出来,求交集,就找到了同时包含这几个汉字的游戏的id

6、最后到数据库里查出来相应的游戏信息即可

缺点: 删除数据不方便

PHP写入redis和检索的代码:

//自动补全
  //不限输入汉字的前后顺序: 输入"国三杀" => 输出 "三国杀"
  function getAutoComplate()
  {
    //$word = $this->input->post('word');
    $word = '三国';
    if (empty($word)) {
      exit('0');
    }
    $intWordLength = mb_strlen($word, 'UTF-8');

    $this->load->library('iredis');
    if (1 == $intWordLength) {
      $arrGid = $this->iredis->getAutoComplate($word);
    } else {
      $arrGid = array();
      for ($i=0; $i < $intWordLength; $i++) {
        $strOne = mb_substr($word, $i, 1, 'UTF-8');
        $arrGidTmp = $this->iredis->getAutoComplate($strOne);
        $arrGid = empty($arrGid) ? $arrGidTmp : array_intersect($arrGid, $arrGidTmp); //求交集,因为传入的参数个数不确定,因此不能直接求交集
      }
    }

    $arrGame = $this->gamemodel->getGameNameForAutoComplate($arrGid);
    // var_dump($arrGame);exit;
    $jsonGame = json_encode($arrGame);
    exit($jsonGame);
  }

  //自动补全, 建立索引
  function setAutoComplate()
  {
    $arrGame = $this->gamemodel->getAllGameNameForAutoComplate();
    $arrIndex = array();
    foreach ($arrGame as $gid => $gname) {
      $intGnameLength = mb_strlen($gname, 'UTF-8');
      for ($i=0; $i < $intGnameLength; $i++) {
        $strOne = mb_substr($gname, $i, 1, 'UTF-8');
        $arrIndex[$strOne][] = $gid;
      }
    }
    
    $this->load->library('iredis');
    foreach ($arrIndex as $word => $arrGid) {
      foreach ($arrGid as $gid) {
        $this->iredis->setAutoComplate($word, $gid);
      }
    }
    
  }

操作redis的方法

//自动补全功能
  public function setAutoComplate($key, $value)
  {
    $youxikey = 'youxi_'.$key;
    $this->sAdd($youxikey, $value);
  }

  //自动补全功能
  public function getAutoComplate($key)
  {
    $youxikey = 'youxi_'.$key;
    return $this->sMembers($youxikey);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
使用php统计字符串中中英文字符的个数
Jun 23 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
PHP之密码加密的几种方式
Jul 29 PHP
php开发工具有哪五款
Nov 09 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
PHP实现文件上传下载实例
Oct 18 PHP
php正则修正符用法实例详解
Dec 29 PHP
PHP数组常用函数实例小结
Aug 20 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
浅谈php中变量的数据类型判断函数
Mar 04 #PHP
PHP检测数据类型的几种方法(总结)
Mar 04 #PHP
php redis实现文章发布系统(用户投票系统)
Mar 04 #PHP
PHP获取当前执行php文件名的代码
Mar 02 #PHP
PHP两种实现无级递归分类的方法
Mar 02 #PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 #PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 #PHP
You might like
PHP Socket 编程
2010/04/09 PHP
php实现的xml操作类
2016/01/15 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
Javascript----文件操作
2007/01/18 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
Python 实现链表实例代码
2017/04/07 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
pycham查看程序执行的时间方法
2018/11/29 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
VC++笔试题
2014/10/13 面试题
机械设计专业应届生求职信
2013/11/21 职场文书
个人授权委托书格式
2014/08/30 职场文书
2014年度安全工作总结
2014/12/04 职场文书
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android