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 相关文章推荐
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
PHP实现获取某个月份周次信息的方法
Aug 11 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
Jun 10 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
php分享朋友圈的实现代码
Feb 18 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
php把文件设置为插件的技巧方法
Feb 03 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的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
PHP实现微信退款功能
2018/10/02 PHP
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
浅谈五大Python Web框架
2017/03/20 Python
python执行使用shell命令方法分享
2017/11/08 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
python实现批量文件重命名
2019/10/31 Python
用python解压分析jar包实例
2020/01/16 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
电气专业推荐信范文
2013/11/18 职场文书
零件设计自荐信范文
2013/11/27 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
弄虚作假心得体会
2014/09/10 职场文书
中学生自我评价2015
2015/03/03 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
Python中threading库实现线程锁与释放锁
2021/05/17 Python
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫