- 核心文件与工作流程
- 默认搜索页 (
search.php) 的使用与局限 - 如何自定义搜索页(高级技巧)
- 搜索页常见问题与解决方案
- 优化搜索页性能与SEO
核心文件与工作流程
织梦搜索功能的实现依赖于几个关键文件:

-
前端入口文件:
/plus/search.php- 这是用户提交搜索请求后访问的核心文件,它负责接收搜索关键词、处理分页、调用搜索逻辑,并将最终结果渲染出来。
- 重要提示:所有对搜索页的修改,通常都是修改这个文件,或者基于它创建一个新的搜索模板。
-
模板文件:
/templets/default/search.htm- 这是
search.php文件用来显示搜索结果的前端模板,你可以通过修改这个文件来改变搜索结果的展示样式,比如列表样式、摘要样式、分页样式等。
- 这是
-
搜索逻辑核心:
/include/arc.searchview.class.php- 这是处理搜索逻辑的核心类,当
search.php接收到请求后,会实例化这个类,并调用其方法来从数据库中查询数据、处理高亮、生成分页等。高级自定义搜索时,我们可能会修改这个类。
- 这是处理搜索逻辑的核心类,当
-
数据库表:
dede_search(或#@__search)
(图片来源网络,侵删)- 这个表是织梦的全文索引表,当你在后台“更新缓存”时,织梦会把所有文章的标题、关键词、内容摘要等信息存入这个表,以加快搜索速度,搜索时,默认情况下就是在这个表里进行查询。
工作流程简图:
用户输入关键词 -> 提交到 /plus/search.php
|
V
search.php 解析参数 (关键词、页码等)
|
V
实例化 arc.searchview.class.php
|
V
在 dede_search 表中执行 SQL 查询
|
V
获取查询结果,处理关键词高亮
|
V
加载 /templets/default/search.htm 模板
|
V
将数据和分页信息填充到模板,生成最终HTML页面返回给用户
默认搜索页 (search.php) 的使用与局限
如何使用默认搜索页?
-
创建搜索表单:在你的网站模板(如
head.htm或index.htm)中,添加一个表单,指向search.php。<form name="formsearch" action="/plus/search.php"> <input type="hidden" name="kwtype" value="0" /> <input type="text" name="q" class="search-keyword" /> <select name="searchtype" class="search-option"> <option value="titlekeyword" selected='1'>智能模糊</option> <option value="title">仅搜索标题</option> </select> <button type="submit" class="search-submit">搜索</button> </form> -
参数说明:
q:搜索关键词(必需)。kwtype:关键词匹配方式。0:智能模糊搜索(默认),会同时匹配标题和内容,是织梦最常用的方式。1:精确匹配。
searchtype:搜索范围。titlekeyword:智能搜索(标题和内容)。title:仅搜索标题。body:仅搜索内容。
typeid:按栏目ID搜索,如果你想只在某个栏目下搜索,可以加上这个参数。
默认搜索页的局限性
- 无法搜索自定义字段:默认搜索只针对系统自带的标题、关键词、内容摘要,如果你给文章模型增加了“品牌”、“产地”等自定义字段,默认搜索是无法找到这些字段的。
- 搜索结果样式单一:
search.htm模板比较简单,无法满足复杂的布局需求。 - 性能问题:当数据量巨大时,对
dede_search表的查询可能会变慢。 - 分页逻辑可能不完美:默认分页在某些特殊情况下可能不准确。
如何自定义搜索页(高级技巧)
这是最核心的部分,下面我们通过两个最常见的场景来讲解如何自定义搜索。
让搜索支持自定义字段
假设你的文章模型有一个自定义字段 brand (品牌),你希望搜索时也能搜到这个字段。
步骤 1:修改核心逻辑类 arc.searchview.class.php
-
打开文件
/include/arc.searchview.class.php。 -
找到
function GetKeywordList($keyword)方法(或类似名称的查询方法,具体版本可能略有不同)。 -
在该方法的 SQL 查询语句中,修改
SELECT和FROM部分。修改前 (默认只搜索 dede_search 表):
// ... 代码片段 ... $this->AddTableSql(" LEFT JOIN `{$this->AddTable}` ON arc.id = {$this->AddTable}.aid "); $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.senddate,arc.arcrank,arc.mid,channel.addtable FROM `{$this->AddTable}` arc $this->AddSql WHERE {$this->ChannelQueries} $this->AddSqlAnd $this->KeywordsSql ORDER BY arc.sortrank desc"; // ... 代码片段 ...修改后 (增加对自定义字段表的关联和搜索): 我们需要同时搜索主表
#@__archives和自定义字段表#@__addonarticle(假设是文章模型)。// 在 GetKeywordList 方法中找到构建 SQL 的地方,进行修改 // 假设你的自定义字段在表 `#@__addonarticle` 中 $addtable = $this->GetChannelTable($this->TypeID); // 获取附加表名,如 #@__addonarticle // 修改 SQL 语句,使其同时搜索标题、内容摘要和自定义字段 // 这是一个示例,你需要根据你的实际字段名调整 $keyword_sql = " (arc.title LIKE '%$keyword%') OR (arc.description LIKE '%$keyword%') "; if ($addtable) { // 添加对附加表的搜索 $keyword_sql .= " OR ({$addtable}.brand LIKE '%$keyword%') "; // 'brand' 是你的自定义字段名 } // 将构建好的 $keyword_sql 替换掉原来的 $this->KeywordsSql // ... 找到最终的 SQL 执行语句 ... $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.senddate,arc.arcrank,arc.mid FROM `#@__archives` arc LEFT JOIN `{$addtable}` ON arc.id = {$addtable}.aid WHERE {$this->ChannelQueries} AND ($keyword_sql) ORDER BY arc.sortrank desc";注意:直接修改核心文件在升级织梦时可能会被覆盖,建议在修改前备份,或者通过二次开发的方式覆盖这个类。
步骤 2:重建全文索引
修改完逻辑后,必须到织梦后台 [系统] -> [数据表与系统工具] -> [一键更新所有] -> [更新数据库缓存],这一步会重新生成 dede_search 表,确保新加入的自定义字段数据被正确索引。
创建一个独立的、功能更强大的搜索页
你想要一个包含高级筛选(如按时间、按栏目、按作者)的搜索页。
步骤 1:创建新的模板文件
复制 /templets/default/search.htm 为 /templets/default/my_search.htm,在这个新模板里,你可以自由设计布局,添加筛选表单。
示例 my_search.htm 模板代码片段:
<form action="/plus/my_search.php" method="get">
<!-- 基础搜索框 -->
<input type="text" name="q" placeholder="请输入关键词">
<!-- 栏目筛选 -->
<select name="typeid">
<option value="0">所有栏目</option>
{dede:channel type='son' currentstyle=''}
<option value='[field:id/]'>[field:typename/]</option>
{/dede:channel}
</select>
<!-- 时间筛选 -->
<select name="time">
<option value="0">所有时间</option>
<option value="1">一天内</option>
<option value="7">一周内</option>
<option value="30">一月内</option>
</select>
<button type="submit">搜索</button>
</form>
<!-- 搜索结果列表 -->
{dede:list pagesize='10'}
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<p>[field:info/]...</p>
<p>发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"]</p>
{/dede:list}
<!-- 分页 -->
{dede:pagelist listitem='info,index,end,pre,next,pageno' listsize='5' /}
步骤 2:创建新的PHP处理文件
复制 /plus/search.php 为 /plus/my_search.php。
-
修改模板文件路径:在
my_search.php中,找到$tempfile = $cfg_basedir.$cfg_templets_dir."/default/search.htm";这一行,将其修改为你的新模板路径:$tempfile = $cfg_basedir.$cfg_templets_dir."/default/my_search.htm";
-
处理新增的筛选参数:在
my_search.php中,接收并处理typeid和time参数,并加入到查询条件中。// 在 my_search.php 中 $typeid = isset($typeid) && is_numeric($typeid) ? $typeid : 0; $time = isset($time) && is_numeric($time) ? $time : 0; // ... 在构建查询条件的地方 ... $addquery = " 1=1 "; if($typeid > 0) { $addquery .= " AND arc.typeid IN (SELECT id FROM `#@__arctype` WHERE id=$typeid OR topid=$typeid) "; } if($time > 0) { $addquery .= " AND arc.senddate > ".(time() - $time * 3600 * 24); } // 将 $addquery 拼接到最终的 SQL 查询中 // ... 找到构建 SQL 的地方 ... $query = "SELECT ... FROM ... WHERE $addquery AND ...";
通过这种方式,你就创建了一个完全由自己控制的、功能更丰富的搜索页面。
搜索页常见问题与解决方案
-
问题1:搜索结果为空,但明明有相关内容。
- 原因:全文索引 (
dede_search表) 没有更新。 - 解决:去后台执行 [系统] -> [数据表与系统工具] -> [一键更新所有] -> [更新数据库缓存]。
- 原因:全文索引 (
-
问题2:搜索结果不包含最新发布的内容。
- 原因:同上,索引未更新,新内容发布后,需要手动更新缓存才能被搜索到。
- 解决:更新数据库缓存,可以考虑设置一个定时任务,定期自动更新。
-
问题3:修改了
search.php或arc.searchview.class.php后不生效。- 原因:
- 文件编码问题(如BOM头)。
- 缓存问题,浏览器或织梦自身缓存。
- 语法错误导致PHP执行失败。
- 解决:
- 用EditPlus等工具检查并去除BOM头。
- 清理浏览器缓存,或使用
Ctrl + F5强制刷新。 - 检查PHP错误日志,看是否有语法错误。
- 原因:
-
问题4:搜索页分页不正确。
- 原因:通常是由于修改了查询逻辑但没有正确处理
TotalResult(总结果数) 变量。 - 解决:在自定义的SQL查询后,务必执行
$this->TotalResult = $dsql->GetOne("SELECT COUNT(*) as dd FROM 你的表 WHERE 条件");来设置正确的总数。
- 原因:通常是由于修改了查询逻辑但没有正确处理
优化搜索页性能与SEO
-
性能优化:
- 保持索引更新:这是最重要的一点,一个最新的索引能保证查询效率。
- 优化数据库:确保
dede_search表和主表#@__archives的字段都有合适的索引(通常织梦会自动创建)。 - 减少不必要的查询:在自定义搜索逻辑时,避免使用
SELECT *,只查询你需要的字段。 - 使用更快的存储引擎:对于超大数据量的网站,可以考虑将数据库引擎从 MyISAM 改为 InnoDB,或者使用专门的搜索引擎如 Elasticsearch(但这需要较大的改动)。
-
SEO优化:
- 设置
title和meta描述:在search.php中,可以根据搜索关键词动态设置页面的title和description,让搜索引擎认为这是一个有价值的页面。// 在 search.php 中 $q = trim($_GET['q']); $title = $q ? "搜索“{$q}”的结果 - ". $cfg_webname : $cfg_webname; $description = $q ? "为您找到与“{$q}”相关的文章,共".$this->TotalResult."条结果。" : $cfg_webname;然后在
search.htm模板的<head>部分调用这些变量。 - URL规范化:确保搜索结果的URL结构清晰、简洁。
- 提供“无结果”页面:当搜索结果为空时,显示一个友好的提示,并引导用户去其他热门页面或使用其他关键词。
- 设置
希望这份详细的指南能帮助你全面掌握织梦搜索页的使用和自定义!
