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的分页功能
Mar 21 PHP
PHP 面向对象 final类与final方法
May 05 PHP
php教程之phpize使用方法
Feb 12 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
Mar 07 PHP
php单例模式实现方法分析
Mar 14 PHP
PHP错误处理函数
Apr 03 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
Mar 31 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
浅谈PHP进程管理
Mar 08 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
php的debug相关函数用法示例
2016/07/11 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
JavaScript 事件系统
2010/07/22 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
2017/01/26 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
django 常用orm操作详解
2017/09/13 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
TensorFlow利用saver保存和提取参数的实例
2018/07/26 Python
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
市政施工员自我鉴定
2014/01/15 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
债务授权委托书范本
2014/10/17 职场文书
离婚协议书的范本
2015/01/27 职场文书
全陪导游词
2015/02/04 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python