最直接、最彻底的方法是修改核心文件,将分词搜索改为精确匹配(全文搜索)。

警告: 修改核心文件可能会导致在升级DedeCMS时被覆盖,修改前请务必备份好相关文件。
修改核心文件,实现精确匹配(推荐)
这个方法的核心思想是,将原本用于分词的函数调用替换为直接对搜索词进行模糊匹配。
操作步骤:
-
找到并打开搜索程序文件 文件路径通常是:
/plus/search.php用FTP或你的主机控制面板找到这个文件,并用代码编辑器(如VS Code, Sublime Text, Notepad++)打开它。 -
定位关键代码 在
search.php文件中,找到处理搜索逻辑的关键部分,通常是在获取搜索关键词之后,构建SQL查询语句之前。
(图片来源网络,侵删)搜索类似
//分词搜索或$keyword = cn_substr($keyword, 30);这样的代码块,你会发现类似下面的代码:// ... 其他代码 ... // 搜索关键词处理 $keyword = trim($keyword); $keyword = cn_substr($keyword, 30); // 截取关键词长度 // --- 这是分词搜索的关键部分 --- if($cfg_fso_type == 'serv'){ require_once(DEDEINC."/splitword.class.php"); $sp = new SplitWord(); $kwsql = $sp->GetKeywordSql($keyword); unset($sp); } else { // ... 其他分词逻辑 ... } // --- 分词部分结束 --- // 构建最终的SQL查询 $query = "SELECT arc.id,arc.title,arc.typeid,arc.ismake,arc.senddate,arc.arcrank,arc.mid,arc.litpic,channel.addtable FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id LEFT JOIN `{$addtable}` channel ON arc.id=channel.aid WHERE $kwsql"; // ... 其他代码 ... -
替换代码,实现精确匹配 我们需要将上面“分词部分”的代码替换掉,改为直接对
keyword字段进行LIKE模糊匹配。将
if($cfg_fso_type == 'serv'){ ... }整个分词逻辑块,替换为以下代码:// --- 新的精确匹配代码 --- // 将关键词按空格分割,支持多关键词搜索 $keywords = explode(' ', $keyword); $kwsql = " ("; $i = 0; foreach($keywords as $k){ if($k != ''){ if($i > 0) $kwsql .= " OR "; // 对标题和描述进行模糊匹配 $kwsql .= " (arc.title LIKE '%$k%' OR arc.description LIKE '%$k%') "; $i++; } } $kwsql .= ") "; // --- 新代码结束 ---代码解释:
explode(' ', $keyword): 将用户输入的搜索词(用空格隔开)分割成一个数组,这样可以支持同时搜索多个关键词。$kwsql = " (";: 开始构建SQL的WHERE条件部分。foreach($keywords as $k): 循环处理每一个关键词。$kwsql .= " OR ";: 如果有多个关键词,它们之间用OR连接,表示满足任意一个即可。$kwsql .= " (arc.title LIKE '%$k%' OR arc.description LIKE '%$k%') ";: 这是核心的匹配逻辑,它会在文章标题(arc.title)和描述(arc.description)字段中搜索包含当前关键词$k的记录。 是SQL中的通配符,表示任意字符。$kwsql .= ") ";: 结束WHERE条件。
-
保存文件 保存修改后的
search.php文件。 -
清空缓存 登录你的DedeCMS后台,在“系统” -> “一键更新站点” -> “更新缓存”,清空一下缓存,确保修改生效。
当你再次使用搜索功能时,它将不再进行分词,而是直接在整个标题和描述中进行精确的模糊匹配搜索。
修改模板,简化搜索框(辅助方法)
这个方法并不能“去掉”分词,但它可以引导用户进行更精确的搜索,避免用户输入长句,通过修改搜索框的提示文字,告诉用户“用空格隔开多个关键词”。
-
找到搜索模板文件 文件路径通常是:
/templets/default/search.htm -
修改搜索框的
placeholder属性 找到<input type="text" name="q" ... />这一行,修改它的placeholder属性。修改前:
<input type="text" name="q" class="search-keyword" id="search-keyword" placeholder="请输入搜索关键词" />
修改后:
<input type="text" name="q" class="search-keyword" id="search-keyword" placeholder="请输入关键词,用空格隔开" />
-
保存文件
这样,当用户看到搜索框的提示时,会更倾向于输入简短、用空格隔开的关键词,这虽然不是真正的“去分词”,但在用户体验上达到了类似的效果,并且对核心代码无侵入。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方法一(修改核心) | 效果最直接、最彻底,真正实现了精确匹配。 | 修改核心文件,升级DedeCMS时可能被覆盖,需要重新修改。 | 强烈推荐,如果你不打算频繁升级系统,或者希望从根本上解决问题。 |
| 方法二(修改模板) | 简单、安全,不修改核心文件,升级无忧。 | 只是引导用户,并未真正改变搜索逻辑,分词功能依然在后台运行。 | 作为辅助手段,或者在不方便修改核心文件的情况下使用。 |
对于绝大多数用户来说,使用方法一 是解决“DedeCMS搜索去掉分词”这个问题的最佳方案。
