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 相关文章推荐
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 PHP
php实现字符串首字母大写和单词首字母大写的方法
Mar 14 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
PHP copy函数使用案例代码解析
Sep 01 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
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
php验证码生成器
2017/05/24 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
FLASH 广告之外的链接
2008/12/16 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
浅谈sass在vue注意的地方
2017/08/10 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python+django实现简单的文件上传
2016/08/17 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
Python的语言类型(详解)
2017/06/24 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
.NET现在共支持多少种语言
2014/02/26 面试题
软件工程师面试题
2012/06/25 面试题
模具数控专业自荐信
2014/01/27 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
个人先进材料范文
2014/12/30 职场文书