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 相关文章推荐
文章推荐系统(二)
Oct 09 PHP
php中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
php Ajax乱码
Apr 09 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
php中Ctype函数用法详解
Dec 09 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
Laravel 加载第三方类库的方法
Apr 20 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
面向切面编程(AOP)的理解
2015/05/01 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
python数据结构之二叉树的建立实例
2014/04/29 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
汽车销售顾问求职自荐信
2014/01/01 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
2014年就业工作总结
2014/11/26 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
Python序列化与反序列化相关知识总结
2021/06/08 Python
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
Nginx的基本概念和原理
2022/03/21 Servers
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
原生JS实现分页
2022/04/19 Javascript
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL