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设计模式 Singleton(单例模式)
Jun 26 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
浅谈PHP变量作用域以及地址引用问题
Dec 27 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
php while循环控制的简单实例
May 30 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP生成随机数的方法总结
Mar 01 PHP
thinkphp5实现无限级分类
Feb 18 PHP
Yii框架模拟组件调用注入示例
Nov 11 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中函数的形参与实参的问题说明
2010/09/01 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
移动节点的jquery代码
2014/01/13 Javascript
JQuery基础语法小结
2015/02/27 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Python的Django框架中if标签的相关使用
2015/07/15 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
pytorch构建多模型实例
2020/01/15 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
会议接待欢迎词
2014/01/12 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
大学生自荐书范文
2015/03/05 职场文书
求职导师推荐信范文
2015/03/27 职场文书
离职信范本
2015/06/23 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书