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 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
php异常处理使用示例
Feb 25 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
Dec 17 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
PHP获取真实客户端的真实IP
Mar 07 PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
Apr 15 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
PHP字符串和十六进制如何实现互相转换
Jul 16 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
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
PHP 字符串分割和比较
2009/10/06 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
asp 的 分词实现代码
2007/05/24 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
Django实现自定义404,500页面教程
2017/03/26 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
详解Python self 参数
2019/08/30 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
工作态度检讨书
2014/02/11 职场文书
黄金搭档广告词
2014/03/21 职场文书
环境整治工作方案
2014/05/18 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
关于安全的广播稿
2014/10/23 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
python爬虫selenium模块详解
2021/03/30 Python