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 相关文章推荐
oracle资料库函式库
Oct 09 PHP
php获取网页内容方法总结
Dec 04 PHP
提交表单后 PHP获取提交内容的实现方法
May 25 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
Yii框架的布局文件实例分析
Sep 04 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
详解Python编程中包的概念与管理
2015/10/16 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
mac下如何将python2.7改为python3
2018/07/13 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
如何在django中实现分页功能
2020/04/22 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
军训考核自我鉴定
2014/02/13 职场文书
教师党员整改措施
2014/10/24 职场文书
办公室岗位职责
2015/02/04 职场文书
党员心得体会范文2016
2016/01/23 职场文书
python周期任务调度工具Schedule使用详解
2021/11/23 Python