Discuz搜索模块解析
功能解析
搜索模块的子模块有8个,相关信息如下:
子模块 | 功能 |
---|---|
album | 搜索相册。 |
blog | 搜索日志。 |
collection | 搜索收藏的帖子。 |
forum | 搜索帖子。 |
group | 搜索群组或群组帖子。 |
my | 貌似已废弃。 |
portal | 搜索门户帖子。 |
user | 搜索用户。 |
discuz的论坛搜索入口可以在/admin.php?action=setting&operation=search页面中配置。搜索项目为搜索论坛的项是直接控制论坛主页的搜索入口的,如果关闭了,论坛就没有搜索入口。各个子模块的功能实现也大同小异,下面我们分析一下主要的实现:
forum–搜索帖子
搜索的相关设置可以在admin页面->全局->搜索设置中找到。如果要支持sphinx搜索,在该页面中配置sphinx服务器。搜索帖子的主要逻辑在search_forum.php文件中,搜索有两种类型,一是标题搜索,二是全文搜索。在启用spinx的情况下,如果搜索类型为全文搜索,discuz才会用sphinx进行搜索,否则discuz会进行数据库的模糊匹配搜索,相关代码如下。模糊匹配搜索在帖子比较多的情况下执行会很耗时,需要多加注意。
if($srchtype == 'fulltext' && $_G['setting']['sphinxon']) {...
} else {...$srcharr = $srchtype == 'fulltext' ? searchkey($keyword, "(p.message LIKE '%{text}%' OR p.subject LIKE '%{text}%')", true) : searchkey($keyword,"t.subject LIKE '%{text}%'", true);
}
检索完成后,discuz会将搜索结果保存到common_searchindex表中作为一次搜索记录,ids那一列即为匹配帖子的tid列表:
$searchid = C::t('common_searchindex')->insert(array('srchmod' => $srchmod,'keywords' => $keywords,'searchstring' => $searchstring,'useip' => $_G['clientip'],'uid' => $_G['uid'],'dateline' => $_G['timestamp'],'expiration' => $expiration,'num' => $num,'ids' => $ids), true);
根据ids获取到帖子的信息后,对标题进行高亮操作,再返回给用户:
foreach(C::t('forum_thread')->fetch_all_by_tid_fid_displayorder(explode(',',$index['ids']), null, 0, $orderby, $start_limit, $_G['tpp'], '>=', $ascdesc) as $thread) {$thread['subject'] = bat_highlight($thread['subject'], $keyword);$thread['realtid'] = $thread['isgroup'] == 1 ? $thread['closed'] : $thread['tid'];$threadlist[$thread['tid']] = procthread($thread, 'dt');$posttables[$thread['posttableid']][] = $thread['tid'];
}
user–搜索用户
如果进行用户搜索,最终会跳转到home.php?mod=spacecp&ac=search页面。我想discuz这么做的主要原因是用户信息是存于UCenter的,所以理论上要通过UCenter进行搜索,但是UCenter又是home模块的范围,所以搜索用户的操作就交给home模块了。搜索的主要逻辑在source/include/spacecp/spacecp_search.php中。搜索用户的过程主要是将各种搜索条件组合成sql语句,需要注意的是用户名有可能进行模糊搜索,需要注意性能,相关代码如下:
foreach (array('uid','username','videophotostatus','avatarstatus') as $value) {if($_GET[$value]) {if($value == 'username' && empty($_GET['precision'])) {$_GET[$value] = stripsearchkey($_GET[$value]);$wherearr[] = 's.'.DB::field($value, '%'.$_GET[$value].'%', 'like');} else {$wherearr[] = 's.'.DB::field($value, $_GET[$value]);}}
}
my–未知作用
这个子模块最终会跳转到网址search.discuz.qq.com,由于这个网址现在已经无法访问了,不知道它的作用是什么,推测是用第三方引擎对本站进行全站的搜索。我当前用的discuz版本是x3.2。
其他模块
其他模块的实现和forum模块的实现差不多,但是都没有用到sphinx,都是对数据库表进行模糊搜索。而且每一次搜索都会记录到common_searchindex表中。
end
到这里搜索模块的功能就大致分析完毕了,由于有些功能找不到入口,比如相册、日志、门户和群组等,并没有实际使用过,都只是对代码做了分析,如果有说错的地方,望指正。
Discuz搜索模块解析相关推荐
- Discuz home模块解析(一)
功能解析 home模块很庞大,包含了discuz论坛和用户信息相关的几乎所有功能,比如动态.消息.勋章.道具等等,有的功能还分为很多小功能,下面列出home模块基本的组成: 子模块 说明 space ...
- Discuz home模块解析(二)
这篇文章将继续分析home模块其余的功能. invite模块 invite模块是邀请注册或者成为好友功能,邀请功能可以在管理后台的全局->注册与访问控制中开启.普通用户邀请的链接如下: http ...
- php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码
一.忘记密码模块路由 二.控制器解析 跟注册.登录的控制器一样,大部分的逻辑使用trait引入. ForgotPasswordController:负责忘记密码页面,以及邮件发送 四.扩展开发:自定义 ...
- 58 同城 iOS 客户端搜索模块组件化实践
[编者按]58 同城 App 自从 1.0 版本开始,便已经提供了搜索功能.随着版本的迭代.业务的复杂,搜索框架也在不断受到挑战.诸如代码不能复用.耦合度高.业务功能接入成本高等问题日积月累,成为需要 ...
- 干货 | 深度学习在携程搜索词义解析中的应用
作者简介 携程旅游研发部大数据与AI研发团队,为旅游事业部提供丰富的AI技术产品和技术能力. 一.背景介绍 搜索是电商最重要的门面之一,大部分用户通过搜索来找到他们想要的商品,因此搜索是用户表达意图最 ...
- webpack模块解析
模块 在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块 每个模块具有比完整程序更小的接触面,使得校验.调试.测试轻而易举. ...
- cuDNN 功能模块解析
cuDNN 功能模块解析 Abstract 本cuDNN 8.0.4开发人员指南概述了cuDNN功能,如可自定义的数据布局.支持灵活的dimension ordering,striding,4D张量的 ...
- 实现一个webpack模块解析器
最近在学习 webpack源码,由于源码比较复杂,就先梳理了一下整体流程,就参考官网的例子,手写一个最基本的 webpack 模块解析器. 代码很少,github地址:手写webpack模块解析器 整 ...
- python中json模块_Python使用内置json模块解析json格式数据的方法
本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...
- TypeScript 素描 - 模块解析、声明合并
模块解析 模块解析有两种方式 相对方式 也就是以/或 ./或-/开头的,比如import jq from "/jq" 非相对方式 比如 import model from ...
最新文章
- 百度大脑开放日第三期:四大全新平台、两大场景方案助力开发者逐梦 AI
- Windows实现appium+iOS自动化测试
- lvs在linux系统下安装,Linux下安装lvs
- Duplicate property mapping of xxx found in xx 嵌套异常,重复的属性在映射中发现。
- 产品经理必知必会知识-竞品分析需求实战报告
- SAP SD 销售凭证如何设置字段必填
- SQLite 命令(http://www.w3cschool.cc/sqlite/sqlite-commands.html)
- C++:数据流和缓冲区
- lsqnonneg函数_matlab中线性最小二乘问题求解
- CSS基础——选择器【学习笔记】
- java发送163邮件
- matlab 加权残值法,分步迭代加权残值法
- 计算机学win7画图,win7自带画图工具(mspaint.exe)
- 蓝桥杯 PREV-10 幸运数
- 消费信贷评分建模与应用笔记-2
- DevOps读书清单:十本应该放入书架的经典
- erdas遥感图像几何校正_实验二 ERDAS遥感图像的几何校正
- C语言反序输出英文句子,iOS开发-英文句子倒序输出
- 云开发谁是卧底线下小游戏发牌助手微信小程序源码-亲测可用
- Nyist 915 +-字符串
热门文章
- 财险产保险公司应用系统各子系统简介
- Js逆向实战之网易云音乐(手把手视频讲解)
- 电影售票系统项目总结
- [渝粤教育] 中国地质大学 计算机会计理论与实务 复习题 (2)
- react 创建组件的两种方式
- 计算机职业规划500字中专,计算机中专生职业规划范文500字中专生职业生涯规划书范文.doc...
- 超级强大服务器终端,告别 XShell 打造强大的Windows 终端
- 如何做出好看的PPT
- 红米note4android,红米Note4深度评测
- 三极管饱和及深度饱和状态的理解和判断