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 相关文章推荐
第十二节 类的自动加载 [12]
Oct 09 PHP
通过5个php实例细致说明传值与传引用的区别
Aug 08 PHP
php include和require的区别深入解析
Jun 17 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
PHP+MySQL删除操作实例
Jan 21 PHP
php从字符串创建函数的方法
Mar 16 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP ADODB生成下拉列表框功能示例
May 29 PHP
PHP匿名函数(闭包函数)详解
Mar 22 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 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打造属于自己的MVC框架
2012/03/07 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
python使用递归解决全排列数字示例
2014/02/11 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
Python 含参构造函数实例详解
2017/05/25 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python调用外部程序的实操步骤
2019/03/04 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python ubplot使用方法解析
2020/01/10 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
生物化工专业个人自荐信
2013/09/26 职场文书
中学生期末评语
2014/02/03 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js