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 相关文章推荐
对javascript和select部件的结合运用
Oct 09 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
PHP匿名函数和use子句用法实例
Mar 16 PHP
简单的自定义php模板引擎
Aug 26 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
python获取图片颜色信息的方法
2015/03/18 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
Python实现自动装机功能案例分析
2020/10/22 Python
舞蹈比赛获奖感言
2014/02/04 职场文书
公司门卫工作职责
2014/06/28 职场文书
写给老师的保证书
2015/05/09 职场文书
关于童年的读书笔记
2015/06/26 职场文书
消夏晚会主持词
2015/06/30 职场文书
详解python的内存分配机制
2021/05/10 Python
Spring整合Mybatis的全过程
2021/06/28 Java/Android
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python