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 将字符串按大写字母分隔成字符串数组
Apr 30 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
php实现统计邮件大小的方法
Aug 06 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
Nov 22 PHP
php筛选不存在的图片资源
Apr 28 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
PHP-X系列教程之内置函数的使用示例
Oct 16 PHP
php通过各种函数判断0和空
Jul 04 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 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
php下实现折线图效果的代码
2007/04/28 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
Javascript 中的类和闭包
2010/01/08 Javascript
Js获取事件对象代码
2010/08/05 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
工程管理造价应届生求职信
2013/11/13 职场文书
社团招新策划书
2014/02/04 职场文书
群众路线自查报告及整改措施
2014/11/04 职场文书
高三英语复习计划
2015/01/19 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python