功能解析

搜索模块的子模块有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搜索模块解析相关推荐

  1. Discuz home模块解析(一)

    功能解析 home模块很庞大,包含了discuz论坛和用户信息相关的几乎所有功能,比如动态.消息.勋章.道具等等,有的功能还分为很多小功能,下面列出home模块基本的组成: 子模块 说明 space ...

  2. Discuz home模块解析(二)

    这篇文章将继续分析home模块其余的功能. invite模块 invite模块是邀请注册或者成为好友功能,邀请功能可以在管理后台的全局->注册与访问控制中开启.普通用户邀请的链接如下: http ...

  3. php验证密码后跳转_php-laravel框架用户验证(Auth)模块解析(四)忘记密码

    一.忘记密码模块路由 二.控制器解析 跟注册.登录的控制器一样,大部分的逻辑使用trait引入. ForgotPasswordController:负责忘记密码页面,以及邮件发送 四.扩展开发:自定义 ...

  4. 58 同城 iOS 客户端搜索模块组件化实践

    [编者按]58 同城 App 自从 1.0 版本开始,便已经提供了搜索功能.随着版本的迭代.业务的复杂,搜索框架也在不断受到挑战.诸如代码不能复用.耦合度高.业务功能接入成本高等问题日积月累,成为需要 ...

  5. 干货 | 深度学习在携程搜索词义解析中的应用

    作者简介 携程旅游研发部大数据与AI研发团队,为旅游事业部提供丰富的AI技术产品和技术能力. 一.背景介绍 搜索是电商最重要的门面之一,大部分用户通过搜索来找到他们想要的商品,因此搜索是用户表达意图最 ...

  6. webpack模块解析

    模块 在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块 每个模块具有比完整程序更小的接触面,使得校验.调试.测试轻而易举. ...

  7. cuDNN 功能模块解析

    cuDNN 功能模块解析 Abstract 本cuDNN 8.0.4开发人员指南概述了cuDNN功能,如可自定义的数据布局.支持灵活的dimension ordering,striding,4D张量的 ...

  8. 实现一个webpack模块解析器

    最近在学习 webpack源码,由于源码比较复杂,就先梳理了一下整体流程,就参考官网的例子,手写一个最基本的 webpack 模块解析器. 代码很少,github地址:手写webpack模块解析器 整 ...

  9. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

  10. TypeScript 素描 - 模块解析、声明合并

    模块解析 模块解析有两种方式 相对方式  也就是以/或 ./或-/开头的,比如import jq  from "/jq" 非相对方式  比如 import model  from ...

最新文章

  1. 百度大脑开放日第三期:四大全新平台、两大场景方案助力开发者逐梦 AI
  2. Windows实现appium+iOS自动化测试
  3. lvs在linux系统下安装,Linux下安装lvs
  4. Duplicate property mapping of xxx found in xx 嵌套异常,重复的属性在映射中发现。
  5. 产品经理必知必会知识-竞品分析需求实战报告
  6. SAP SD 销售凭证如何设置字段必填
  7. SQLite 命令(http://www.w3cschool.cc/sqlite/sqlite-commands.html)
  8. C++:数据流和缓冲区
  9. lsqnonneg函数_matlab中线性最小二乘问题求解
  10. CSS基础——选择器【学习笔记】
  11. java发送163邮件
  12. matlab 加权残值法,分步迭代加权残值法
  13. 计算机学win7画图,win7自带画图工具(mspaint.exe)
  14. 蓝桥杯 PREV-10 幸运数
  15. 消费信贷评分建模与应用笔记-2
  16. DevOps读书清单:十本应该放入书架的经典
  17. erdas遥感图像几何校正_实验二 ERDAS遥感图像的几何校正
  18. C语言反序输出英文句子,iOS开发-英文句子倒序输出
  19. 云开发谁是卧底线下小游戏发牌助手微信小程序源码-亲测可用
  20. Nyist 915 +-字符串

热门文章

  1. 财险产保险公司应用系统各子系统简介
  2. Js逆向实战之网易云音乐(手把手视频讲解)
  3. 电影售票系统项目总结
  4. [渝粤教育] 中国地质大学 计算机会计理论与实务 复习题 (2)
  5. react 创建组件的两种方式
  6. 计算机职业规划500字中专,计算机中专生职业规划范文500字中专生职业生涯规划书范文.doc...
  7. 超级强大服务器终端,告别 XShell 打造强大的Windows 终端
  8. 如何做出好看的PPT
  9. 红米note4android,红米Note4深度评测
  10. 三极管饱和及深度饱和状态的理解和判断