如何禁用Dede搜索分词功能?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 DEDE建站 正文

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

dede搜索去掉分词
(图片来源网络,侵删)

警告: 修改核心文件可能会导致在升级DedeCMS时被覆盖,修改前请务必备份好相关文件。


修改核心文件,实现精确匹配(推荐)

这个方法的核心思想是,将原本用于分词的函数调用替换为直接对搜索词进行模糊匹配。

操作步骤:

  1. 找到并打开搜索程序文件 文件路径通常是:/plus/search.php 用FTP或你的主机控制面板找到这个文件,并用代码编辑器(如VS Code, Sublime Text, Notepad++)打开它。

  2. 定位关键代码search.php 文件中,找到处理搜索逻辑的关键部分,通常是在获取搜索关键词之后,构建SQL查询语句之前。

    dede搜索去掉分词
    (图片来源网络,侵删)

    搜索类似 //分词搜索$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";
    // ... 其他代码 ...
  3. 替换代码,实现精确匹配 我们需要将上面“分词部分”的代码替换掉,改为直接对 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 条件。
  4. 保存文件 保存修改后的 search.php 文件。

  5. 清空缓存 登录你的DedeCMS后台,在“系统” -> “一键更新站点” -> “更新缓存”,清空一下缓存,确保修改生效。

当你再次使用搜索功能时,它将不再进行分词,而是直接在整个标题和描述中进行精确的模糊匹配搜索。


修改模板,简化搜索框(辅助方法)

这个方法并不能“去掉”分词,但它可以引导用户进行更精确的搜索,避免用户输入长句,通过修改搜索框的提示文字,告诉用户“用空格隔开多个关键词”。

  1. 找到搜索模板文件 文件路径通常是:/templets/default/search.htm

  2. 修改搜索框的 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="请输入关键词,用空格隔开" />
  3. 保存文件

这样,当用户看到搜索框的提示时,会更倾向于输入简短、用空格隔开的关键词,这虽然不是真正的“去分词”,但在用户体验上达到了类似的效果,并且对核心代码无侵入。


总结与建议

方法 优点 缺点 适用场景
方法一(修改核心) 效果最直接、最彻底,真正实现了精确匹配。 修改核心文件,升级DedeCMS时可能被覆盖,需要重新修改。 强烈推荐,如果你不打算频繁升级系统,或者希望从根本上解决问题。
方法二(修改模板) 简单、安全,不修改核心文件,升级无忧。 只是引导用户,并未真正改变搜索逻辑,分词功能依然在后台运行。 作为辅助手段,或者在不方便修改核心文件的情况下使用。

对于绝大多数用户来说,使用方法一 是解决“DedeCMS搜索去掉分词”这个问题的最佳方案。

-- 展开阅读全文 --
头像
织梦会员中心仿作,关键步骤与难点在哪?
« 上一篇 前天
C语言如何实现varchar类型存储?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

目录[+]