本文将分为以下几个部分,由浅入深地为你讲解:

- 核心概念:理解织梦搜索的“三驾马车”
- 默认搜索功能的使用与配置:最基础、最通用的方法
- 高级搜索方法:针对特定栏目或特定字段的搜索
- 常见问题与解决方案:解决搜索不到结果、结果不准等难题
- 自定义开发:如何修改或开发自己的搜索功能
核心概念:理解织梦搜索的“三驾马车”
织梦的前台搜索功能,其核心依赖于三个关键文件:
-
搜索页面模板:
search.htm- 这是用户在搜索结果页看到的页面,它定义了搜索结果的展示样式,包括标题、发布时间等。
- 路径:
/templets/default/search.htm(默认模板)
-
搜索表单页面:通常是网站首页或其他页面上的一个表单。
- 这个表单的
action属性指向了处理搜索的PHP文件。 - 一个最简单的搜索表单代码如下:
<form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get"> <input type="hidden" name="kwtype" value="0" /> <input type="hidden" name="searchtype" value="titlekeyword" /> <input type="text" name="q" class="search-keyword" placeholder="请输入关键词" /> <button type="submit" class="search-submit">搜索</button> </form> action指向了search.php。name="q"是用户输入的关键词字段。name="kwtype"和name="searchtype"是搜索类型参数。
- 这个表单的
-
搜索处理程序:
/plus/search.php
(图片来源网络,侵删)- 这是搜索功能的“大脑”,它接收来自搜索表单的数据,调用相应的搜索逻辑,从数据库中查询数据,最后将结果渲染到
search.htm模板中。
- 这是搜索功能的“大脑”,它接收来自搜索表单的数据,调用相应的搜索逻辑,从数据库中查询数据,最后将结果渲染到
总结一下流程: 用户在 搜索表单 输入关键词 -> 点击提交 -> 请求发送到 search.php -> search.php 查询数据库 -> 将数据传递给 search.htm -> 最终显示 搜索结果页。
默认搜索功能的使用与配置
这是最简单的方式,适用于大多数普通网站。
A. 如何使用?
- 确保表单正确:在你的网站首页(如
index.htm)或任何你希望放置搜索框的地方,加入上面提到的搜索表单代码。 - 确保模板存在:检查
/templets/你的模板文件夹/目录下是否存在search.htm文件,如果使用默认模板,它一定存在。 - 访问搜索页:在网站前台输入关键词并搜索,浏览器会跳转到类似
http://你的网站域名/plus/search.php?q=关键词的页面。
B. 后台配置(非常重要)
织梦的搜索行为很多都可以在后台配置,路径是:【系统】->【系统基本参数】->【核心设置】
在这里你会看到几个关键的搜索相关选项:

- 全文搜索开关:设置为“是”才能使用搜索功能。
- 搜索页面大小:每页显示多少条搜索结果。
- 搜索结果高亮:是否将关键词在结果中用颜色标出。
- 启用远程模糊搜索:
- 关闭:只搜索标题和文章内容。速度快,但可能搜不到错别词。
- 开启:会调用百度等搜索引擎的API进行搜索。可以搜到错别词,但速度慢,且依赖外部API,有失败风险。
- 建议:对于大多数网站,保持关闭状态,通过优化下面的关键词权重来获得更好的本地搜索效果。
高级搜索方法
默认搜索是全站搜索,但很多时候我们需要更精确的控制。
A. 针对特定栏目搜索
如果你只想在某个或某几个栏目里搜索,可以在搜索表单中增加一个 typeid 字段。
示例:只搜索“产品中心”栏目(假设其ID为 3)
<form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get">
<input type="hidden" name="kwtype" value="0" />
<input type="hidden" name="searchtype" value="titlekeyword" />
<input type="hidden" name="typeid" value="3" /> <!-- 增加这一行 -->
<input type="text" name="q" class="search-keyword" placeholder="请输入关键词" />
<button type="submit" class="search-submit">搜索</button>
</form>
这样,搜索就只会限定在ID为3的栏目及其子栏目中。
B. 搜索特定字段(如简介、作者)
默认搜索只搜索标题和内容,如果你想搜索文章的简介(description)字段,需要修改 search.php 文件。
修改步骤:
-
打开
/plus/search.php文件。 -
找到构建SQL查询语句的地方,通常在
//获得关键词和//保存搜索日志之间。 -
找到类似
($keyword = FilterSearch($keyword));的代码。 -
在它后面,找到
if($typeid>0)之前的逻辑,你会看到类似这样的代码:// 在这里构建查询条件 $addsql = " arc.arcrank > -1 "; if($typeid>0) { // ... 栏目查询逻辑 } if($keyword!='') { $ksql = " ("; // 关键词分词 $karr = explode(' ', $keyword); $karr = array_filter($karr); $kewsqls = array(); foreach($karr as $k){ $kewsqls[] = " (arc.title like '%$k%' OR arc.body like '%$k%') "; } if(!empty($kewsqls)) $ksql .= join(' OR ',$kewsqls); $ksql .= ") "; $addsql .= " AND $ksql "; } -
修改
OR arc.body like '%$k%'这一行,增加你想要搜索的字段,要同时搜索简介(description)字段:// 修改前 $kewsqls[] = " (arc.title like '%$k%' OR arc.body like '%$k%') "; // 修改后 $kewsqls[] = " (arc.title like '%$k%' OR arc.body like '%$k%' OR arc.description like '%$k%') ";
-
保存文件并覆盖,现在搜索就会同时包含标题、内容和简介了。
常见问题与解决方案
问题1:搜索不到任何结果,但内容明明存在。
原因及解决方案:
-
数据库未生成全文索引:这是最常见的原因,织梦搜索依赖一个名为
dede_searchindex的索引表,如果这个表是空的或未更新,就搜不到东西。- 解决方法:登录网站后台,进入 【采集】-> 【文档关键词维护】,点击右上角的“重新建立索引**”按钮,这个过程可能需要一些时间,特别是内容多的网站,完成后,搜索功能就会恢复正常。
-
搜索关键词太短:织梦默认有最小搜索长度限制,通常是2个字符,你搜一个字或搜“的”、“是”等无意义的词,会搜不到。
- 解决方法:修改
/plus/search.php文件,找到$keyword = trim($keyword);后面,加入长度判断。$keyword = trim($keyword); if (strlen($keyword) < 2) { // 设置最小搜索长度为2 ShowMsg('搜索关键词不能少于2个字符!', '-1'); exit(); }或者,如果你想彻底移除这个限制,可以找到
if($keyword!='')的判断,改为if($keyword!==false)。
- 解决方法:修改
-
被过滤了特殊字符:关键词中可能包含被系统过滤掉的字符。
- 解决方法:检查后台的 【系统】-> 【系统基本参数】-> 【过滤设置】,看看哪些字符被过滤了,或者尝试简化你的搜索关键词。
问题2:搜索结果不准确,相关性差。
原因及解决方案:
-
只搜索了标题和内容的权重远高于内容,默认的搜索逻辑是
OR关系,即标题包含关键词 或者 内容包含关键词都会被搜出来,这导致很多不相关的内容也出现在结果中。-
解决方案:修改
/plus/search.php,将OR改为AND更高的权重。// 修改前 $kewsqls[] = " (arc.title like '%$k%' OR arc.body like '%$k%') "; // 修改后:要求标题和内容都必须包含,并且标题的权重更高(这里用括号和逻辑组合实现) // 更高级的做法是给标题匹配加分,但这需要修改底层逻辑,一个简单的优化是: $kewsqls[] = " ((arc.title like '%$k%') OR (arc.body like '%$k%' AND arc.title like '%$k%')) ";
这个修改逻辑比较复杂,更推荐的做法是修改搜索算法,但这属于高级开发了。
-
-
未启用高亮或高亮设置不当:虽然不影响结果数量,但影响用户体验。
自定义开发
当默认功能无法满足需求时,就需要进行二次开发。
场景:使用更强大的全文索引(如 Sphinx)
对于大型门户网站,默认的 LIKE '%...%' 搜索效率极低,这时可以集成专业的全文搜索引擎,如 Sphinx 或 Elasticsearch。
基本思路:
- 安装 Sphinx:在你的服务器上安装 Sphinx 服务。
- 配置 Sphinx:创建 Sphinx 的配置文件(
.conf),告诉 Sphinx 如何索引织梦的dede_archives等数据表。 - 创建数据同步脚本:写一个 PHP 脚本,定时或手动执行,将织梦数据库中的数据增量或全量地同步到 Sphinx 的索引中。
- 修改
/plus/search.php:将文件中的数据库查询逻辑,替换为向 Sphinx 发送搜索请求的逻辑,并解析 Sphinx 返回的结果ID,再根据ID去织梦数据库中取出完整的文章信息进行展示。 - 优化模板:根据新的数据结构,微调
search.htm模板。
这是一个复杂的工程,但能带来数量级的性能提升。
场景:调用外部API(如百度、谷歌搜索)
站长希望直接使用百度或谷歌的搜索结果。
基本思路:
- 修改
search.php:删除所有本地数据库查询代码。 - 使用 cURL:在
search.php中使用 PHP 的 cURL 库,向百度或谷歌的搜索API发送请求,带上用户输入的关键词。 - 解析返回的JSON或HTML:解析API返回的结果,提取出标题、链接和摘要。
- 传递给模板:将解析后的数据格式化为一个数组,然后分配给模板
search.htm。 - 修改
search.htm:模板文件不再使用织梦的循环标签{dede:list},而是使用普通的 PHP 循环来展示从API获取的数据。
这种方式简单快捷,但失去了对内容的完全控制,并且受限于外部API的稳定性和政策。
织梦的前台搜索功能是一个可深可浅的模块。
- 新手入门:掌握 后台配置 和 重建索引 就能解决80%的问题。
- 进阶用户:学会修改 搜索表单 来限定栏目,修改
search.php来增加搜索字段。 - 高级开发者:可以尝试 替换底层搜索逻辑,甚至集成 Sphinx 等专业搜索引擎来构建高性能的站内搜索系统。
希望这份详细的指南能帮助你完全掌握织梦的前台搜索功能!
