PHP+redis实现超迷你全文检索

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 2014年10月31日 11:45:39 情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗时又费眼 效果: 输入"三国"或者"国三", 将自动列出所有包含"三国"的游戏名字, 输入不限顺...

2014年10月31日 11:45:39

情景: 我们平台有好多游戏, 运营的同事在查询某一款游戏的时候, 目前使用的是html的select下拉列表的展现形式, 运营的同事得一个个去找,然后选中,耗时又费眼

效果: 输入"三国"或者"国三", 将自动列出所有包含"三国"的游戏名字, 输入不限顺序; 例如输入"杀三国",仍然会将"三国杀"这款游戏找出来

实现: 我用redis的集合+PHP的array_intersect()和mb系列函数, 实现了一个超迷你的全文检索功能

原理: (大道不过两三言,说穿不值一文钱,哈哈)

1, 将所有的游戏名字读出来,拆分成单个汉字

2, 将这些汉字作为redis集合的键,写入redis,每个集合里的值是所有那些游戏名字中包含此汉字的游戏的id

3, 当用户输入文字的时候通过ajax异步请求,将用户输入传给PHP

4, 将输入的文字拆分成单个汉字, 分别找到这些汉字在redis中的集合值

5, 取出来,求交集,就找到了同时包含这几个汉字的游戏的id

6, 最后到数据库里查出来相应的游戏信息即可

缺点: 删除数据不方便

 PHP写入redis和检索的代码:

 1     //自动补全
 2     //不限输入汉字的前后顺序: 输入"国三杀" => 输出 "三国杀"
 3     function getAutoComplate()
 4     {
 5         //$word = $this->input->post('word');
 6         $word = '三国';
 7         if (empty($word)) {
 8             exit('0');
 9         }
10         $intWordLength = mb_strlen($word, 'UTF-8');
11 
12         $this->load->library('iredis');
13         if (1 == $intWordLength) {
14             $arrGid = $this->iredis->getAutoComplate($word);
15         } else {
16             $arrGid = array();
17             for ($i=0; $i < $intWordLength; $i++) {
18                 $strOne = mb_substr($word, $i, 1, 'UTF-8');
19                 $arrGidTmp = $this->iredis->getAutoComplate($strOne);
20                 $arrGid = empty($arrGid) ? $arrGidTmp : array_intersect($arrGid, $arrGidTmp); //求交集,因为传入的参数个数不确定,因此不能直接求交集
21             }
22         }
23 
24         $arrGame = $this->gamemodel->getGameNameForAutoComplate($arrGid);
25         // var_dump($arrGame);exit;
26         $jsonGame = json_encode($arrGame);
27         exit($jsonGame);
28     }
29 
30     //自动补全, 建立索引
31     function setAutoComplate()
32     {
33         $arrGame = $this->gamemodel->getAllGameNameForAutoComplate();
34         $arrIndex = array();
35         foreach ($arrGame as $gid => $gname) {
36             $intGnameLength = mb_strlen($gname, 'UTF-8');
37             for ($i=0; $i < $intGnameLength; $i++) {
38                 $strOne = mb_substr($gname, $i, 1, 'UTF-8');
39                 $arrIndex[$strOne][] = $gid;
40             }
41         }
42         
43         $this->load->library('iredis');
44         foreach ($arrIndex as $word => $arrGid) {
45             foreach ($arrGid as $gid) {
46                 $this->iredis->setAutoComplate($word, $gid);
47             }
48         }
49         
50     }

 操作redis的方法

 1     //自动补全功能
 2     public function setAutoComplate($key, $value)
 3     {
 4         $youxikey = 'youxi_'.$key;
 5         $this->sAdd($youxikey, $value);
 6     }
 7 
 8     //自动补全功能
 9     public function getAutoComplate($key)
10     {
11         $youxikey = 'youxi_'.$key;
12         return $this->sMembers($youxikey);
13     }

 

 

Finger PHP 框架

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
45 5
|
2月前
|
存储 NoSQL PHP
PHP与Redis结合使用,提升数据存储性能
随着互联网应用的发展,PHP与Redis的结合成为提升数据存储性能的重要手段。PHP作为流行的服务器端语言,常用于网站开发;Redis作为高性能内存数据库,以其快速读写能力,有效优化数据访问速度,减轻数据库压力。两者结合通过缓存机制显著提升应用响应速度,支持高并发场景下的稳定性和可扩展性。
|
2月前
|
存储 NoSQL 关系型数据库
PHP 使用 Redis
10月更文挑战第22天
42 6
|
3月前
|
缓存 NoSQL 数据处理
原生php实现redis缓存配置和使用方法
通过上述步骤,你可以在PHP项目中配置并使用Redis作为高性能的缓存解决方案。合理利用Redis的各种数据结构和特性,可以有效提升应用的响应速度和数据处理效率。记得在实际应用中根据具体需求选择合适的缓存策略,如设置合理的过期时间,以避免内存过度消耗。
69 0
|
4月前
|
消息中间件 NoSQL Go
PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践
【9月更文挑战第7天】在从 PHP 的 ThinkPHP 框架迁移到 Go 的 Gin 框架时,涉及 Redis 延时消息队列的技术实践主要包括:理解延时消息队列概念,其能在特定时间处理消息,适用于定时任务等场景;在 ThinkPHP 中使用 Redis 实现延时队列;在 Gin 中结合 Go 的 Redis 客户端库实现类似功能;Go 具有更高性能和简洁性,适合处理大量消息。迁移过程中需考虑业务需求及系统稳定性。
|
NoSQL PHP Redis
Mac PHP安装Redis扩展
php安装redis的扩展 采用pecl命令进行安装; pecl命令,在使用brew 安装php时,已经为我们安装上了,这里我们直接使用即可。 我们先进入php的bin目录看下命令是否存在,对应路径如下: cd /opt/homebrew/Cellar/php@7.3/7.3.32 这里的7.3为我通过brew install [php@7.3]安装的php具体版本号,大家可以通过ls命令查看文件夹下是否存在pecl命令
1457 0
|
NoSQL PHP Apache
windows下PHP安装Redis扩展不成功的可能原因
windows下PHP安装Redis扩展不成功的可能原因
525 0
windows下PHP安装Redis扩展不成功的可能原因
|
NoSQL Linux PHP
php7安装redis6扩展
php7安装redis6扩展
188 0