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 Stream_*系列函数
Aug 01 PHP
php 代码优化之经典示例
Mar 24 PHP
php读取excel文件的简单实例
Aug 26 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
Apr 24 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
Jul 19 PHP
php格式化时间戳显示友好的时间实现思路及代码
Oct 23 PHP
PHP封装的MSSql操作类完整实例
May 26 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 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
PHP生成Flash动画的实现代码
2010/03/12 PHP
一个PHP分页类的代码
2011/05/18 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
浅说js变量
2011/05/25 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
JavaScript 日期时间选择器一些小结
2018/04/02 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
Python字符串详细介绍
2015/05/09 Python
浅析Python中的多条件排序实现
2016/06/07 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
出售房屋委托书范本
2014/09/24 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
mysql知识点整理
2021/04/05 MySQL
vue实现移动端div拖动效果
2022/03/03 Vue.js
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python