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 相关文章推荐
第二节--PHP5 的对象模型
Nov 16 PHP
php继承的一个应用
Sep 06 PHP
phpize的深入理解
Jun 03 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
php操作xml
Oct 27 PHP
php中curl使用指南
Feb 05 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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入门的学习方法
2007/01/02 PHP
url decode problem 解决方法
2011/12/26 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
原生js调用json方法总结
2018/02/22 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python实现的简单发送邮件脚本分享
2014/11/07 Python
用Python写冒泡排序代码
2016/04/12 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
Python函数调用追踪实现代码
2020/11/27 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
建龙钢铁面试总结
2014/04/15 面试题
物流仓管员工作职责
2014/01/06 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
小学教师师德整改措施
2014/09/29 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
求职自我推荐信
2015/03/24 职场文书
工作建议书范文
2019/07/08 职场文书
如何计划开一家便利店?
2019/07/31 职场文书