DedeCMS 5.7 的搜索功能是其内置的一个核心模块,主要用于在网站前台为访客提供内容检索服务,它主要依赖于一个核心的 PHP 文件 plus/search.php 和一个数据表 dede_search。

下面我将从 工作原理、使用方法、自定义修改、常见问题 四个方面进行详细说明。
工作原理
DedeCMS 5.7 的搜索流程相对简单:
- 触发搜索:用户在前台搜索框(通常是一个表单)中输入关键词,然后点击“搜索”按钮。
- 请求发送:表单数据(通常是关键词
q)被发送到plus/search.php文件。 - 关键词处理:
search.php接收关键词,并进行一些基本的处理,如去除多余空格、转义等。 - 数据库查询:
- 程序会根据配置,选择在哪些数据表中搜索,默认情况下,主要搜索 (
title) 和 (body)。 - 它会执行一个 SQL
LIKE查询,在dede_archives表(文章主表)的title和description(或body) 字段中查找包含关键词的记录。 - 注意:默认搜索 不区分大小写。
- 程序会根据配置,选择在哪些数据表中搜索,默认情况下,主要搜索 (
- 结果展示:查询到的结果会被分页,然后通过一个固定的模板文件(
search.htm)进行渲染,最终将包含关键词的文章列表展示给用户。 - 记录搜索:搜索结果会同时被记录到
dede_search数据表中,用于统计热门搜索词等功能。
使用方法
前台调用搜索框
在你的模板文件(通常是 head.htm 或 index.htm)中,你需要放置一个搜索表单,最简单的代码如下:
<form name="formsearch" action="/plus/search.php">
<div class="form-search">
<input type="hidden" name="kwtype" value="0" />
<input type="text" name="q" class="search-keyword" placeholder="搜索关键词..." />
<button type="submit" class="search-submit">搜索</button>
</div>
</form>
action="/plus/search.php":指定搜索程序的处理地址。name="q":这是传递关键词的参数名,search.php默认接收这个参数。name="kwtype" value="0":指定搜索类型。0和内容中搜索(默认)。1中搜索。2:仅在文章标签中搜索。
后台配置搜索
进入 DedeCMS 后台,找到 “核心” -> “批量维护” -> “搜索引擎配置”。

在这里你可以进行一些基本设置:
- 开启/关闭搜索:可以暂时关闭搜索功能。
- 默认搜索栏目:可以设置搜索默认在哪些栏目下进行。
- 搜索结果条数:每页显示的搜索结果数量。
- 是否全站搜索:选择是或否。
自定义与修改
很多时候,默认的搜索功能无法满足需求,比如需要高亮、需要按特定字段搜索、需要修改搜索模板等。
修改搜索结果模板
搜索结果的展示页面模板是 templets/default/search.htm,你可以直接编辑这个文件来改变搜索结果的样式。
- 核心变量:
{dede:global name='keyword'/}:显示用户搜索的关键词。{dede:list pagesize='10'}:循环输出搜索结果,pagesize控制每页显示数量。[field:title/]。[field:pubdate function="MyDate('Y-m-d',@me)"/]:发布日期。[field:description/]:[field:arcurl/]:文章链接。{dede:pagelist listsize='4' listitem='index pre pageno next end '/}:分页条。
示例:修改 search.htm 以高亮显示关键词

你需要在 {dede:list} 之前和之后添加一些 PHP 代码来实现关键词高亮。
{dede:global name='keyword' function='RemoveXSS(@me)'/}
{dede:global name='keyword' function='htmlspecialchars(@me)'/}
<!-- 在 {dede:list} 循环内部 -->
{dede:list}
<li>
<a href="[field:arcurl/]" target="_blank">
[field:title function='(str_replace("关键词", "<span style='color:red'>关键词</span>", @me) )'/]
</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
<p>[field:description/]...</p>
</li>
{/dede:list}
注意:上面的
str_replace只是一个简单示例,更健壮的高亮方法是使用 PHP 的preg_replace函数,并结合htmlspecialchars来防止 XSS 攻击,你可以在search.php中处理高亮逻辑,然后将处理后的$title变量传递给模板。
修改搜索逻辑(进阶)
如果你需要更复杂的搜索,比如按自定义字段搜索、改变搜索算法等,你需要直接修改 plus/search.php 文件。
示例:增加按自定义字段 myfield 搜索
-
修改
search.php: 在search.php中找到执行查询的 SQL 语句部分(通常在if(!empty($keyword))条件块内)。 默认的 SQL 类似这样:$keyword = trim($keyword); $addquery = " And (arc.title like '%$keyword%' or arc.description like '%$keyword%')"; $typeid = intval($typeid); if($typeid>0){ $addquery .= " And arc.typeid='$typeid' "; } $query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath From `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id where arc.arcrank > -1 $addquery order by arc.sortrank desc";你可以修改
$addquery来增加搜索条件:// 假设你的自定义字段在 dede_archives 表中,字段名为 myfield $addquery = " And (arc.title like '%$keyword%' or arc.description like '%$keyword%' or arc.myfield like '%$keyword%')";
-
重新生成栏目或内容: 修改了数据表结构或查询逻辑后,可能需要重新生成相关栏目或内容,以确保搜索能找到最新数据。
常见问题与解决方案
搜索不到内容,但内容确实存在
- 原因1:文章未审核或未生成
搜索默认只查找
arcrank > -1的文章,即已审核的文章,请检查文章是否已通过审核,并且已经生成静态页面(或开启了动态浏览)。 - 原因2:关键词太短或太常见 DedeCMS 默认可能会过滤掉一些过短或无意义的词(如“的”、“是”等),可以尝试更换一个更长、更具体的关键词。
- 原因3:编码问题 确保网站数据库、页面文件和搜索词的编码一致(通常是 UTF-8)。
- 原因4:模板标签错误
检查
search.htm中的{dede:list}标签是否正确,以及分页标签是否正确。
搜索结果不准确,想增加/减少搜索范围
- 解决方案:
- 增加范围:修改
plus/search.php中的$addquery变量,在like条件中增加你想要搜索的字段名,arc.keywords(文章关键字)或arc.writer(作者)。 - 减少范围:同样地,从
$addquery中移除你不希望搜索的字段。
- 增加范围:修改
想实现更强大的搜索(如全文索引)
DedeCMS 5.7 自带的 LIKE '%关键词%' 搜索方式在数据量大时效率很低,且无法实现分词搜索(例如搜索“网站建设”,不会匹配到“网站建设公司”)。
- 解决方案:
如果网站数据量很大,对搜索性能和准确性要求高,可以考虑以下方案:
- 使用第三方搜索插件:市面上有很多基于 DedeCMS 的增强搜索插件,它们可能使用了更高效的索引技术。
- 集成外部搜索引擎:
- MySQL 全文索引:如果你使用的是 MySQL 5.6+ 版本,可以为
title和body字段添加全文索引,并修改search.php的查询语句使用MATCH ... AGAINST语法,这需要一定的数据库操作能力。 - 第三方服务:如 Elasticsearch 或 Algolia,这需要较深的技术投入,但能提供最专业、最快速的搜索体验,通常需要开发一个数据同步程序,将 DedeCMS 的数据实时或定时推送到搜索引擎中。
- MySQL 全文索引:如果你使用的是 MySQL 5.6+ 版本,可以为
DedeCMS 5.7 的搜索功能是一个基础但可定制的模块,对于小型网站,默认功能基本够用,通过修改 search.htm 可以轻松改变展示样式,而要改变搜索逻辑,则需要深入 plus/search.php 进行代码级调整,对于有更高性能和功能需求的网站,则需要考虑升级到更专业的搜索解决方案。
