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的控制语句
Oct 09 PHP
PHP图片上传类带图片显示
Nov 25 PHP
自己前几天写的无限分类类
Feb 14 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
Jan 12 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
laravel自定义分页效果
Jul 23 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
PHP 实现文件压缩解压操作的方法
Jun 14 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
SONY ICF-SW7600的电路分析
2021/03/02 无线电
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
使用js显示当前时间示例
2014/03/02 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
Position属性之relative用法
2015/12/14 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
python实时监控logstash日志代码
2020/04/27 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
python代码实现图书管理系统
2020/11/30 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
金融学专科生自我鉴定
2014/02/21 职场文书
餐饮投资计划书
2014/04/25 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
颐和园导游词
2015/01/30 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python