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 相关文章推荐
BBS(php &amp; mysql)完整版(七)
Oct 09 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
php之XML转数组函数的详解
Jun 07 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
ThinkPHP模板自定义标签使用方法
Jun 26 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
PHP中使用addslashes函数转义的安全性原理分析
Nov 03 PHP
php绘制一个矩形的方法
Jan 24 PHP
PHP解压tar.gz格式文件的方法
Feb 14 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
php的api数据接口书写实例(推荐)
Sep 22 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
JavaScript的Function详细
2006/11/14 Javascript
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
vue项目中用cdn优化的方法
2018/01/03 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
Python中文件遍历的两种方法
2014/06/16 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
汽车队司机先进事迹材料
2014/02/01 职场文书
销售员岗位职责范本
2014/02/03 职场文书
中式结婚主持词
2014/03/14 职场文书
cf战队收人广告词
2014/03/14 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
计算机软件专业求职信
2014/06/10 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
实习班主任自我评价
2015/03/11 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
《雷雨》教学反思
2016/02/20 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书