在Discuz X3.1中实现门户文章全文检索功能是一项非常实用的技术改进。以下内容将详细介绍如何通过修改代码实现这一功能,同时确保搜索引擎优化(SEO)效果更佳。
首先,需要明确的是,本文中的检索方法是基于`LIKE`语句实现的。虽然这种方法简单直接,但如果您的站点数据量较大,可能会对系统性能造成一定影响,请根据实际情况权衡利弊后再决定是否采用。
为了满足特定需求,例如对文章内容进行全文检索,我们可以通过以下步骤实现:
### 步骤 1:修改核心文件 使用Notepad++或其他文本编辑器打开以下文件:
网站目录\\source\\class\\table\\table_portal_article_content.php
找到如下代码段:

class table_portal_article_content extends discuz_table
{
在其后添加以下代码:

public function fetch_all_by_sql($where, $order = '', $start = 0, $limit = 0, $count = 0, $alias = '') {
    $where = $where && !is_array($where) ? " WHERE $where" : '';
    if(is_array($order)) {
        $order = '';
    }
    if($count) {
        return DB::result_first('SELECT count(*) FROM '.DB::table($this->_table).' %i %i %i '.DB::limit($start, $limit), array($alias, $where, $order));
    }
    return DB::fetch_all('SELECT * FROM '.DB::table($this->_table).' %i %i %i '.DB::limit($start, $limit), array($alias, $where, $order));
}
保存文件。这一步是为了让查询函数能够支持自定义SQL条件。
### 步骤 2:修改搜索逻辑 接下来,打开以下文件:
网站目录\\source\\module\\search\\search_portal.php
找到如下代码段:

foreach($query as $article) {
    $ids .= ','.$article['aid'];
    $num++;
}
在其后添加以下代码:

if($num == 0){
    list($srchtxt, $srchtxtsql) = searchkey($keyword, "content LIKE '%{text}%'", true);
    $query = C::t('portal_article_content')->fetch_all_by_sql(' 1 '.$srchtxtsql, 'ORDER BY aid DESC ', 0, $_G['setting']['search']['portal']['maxsearchresults']);
    foreach($query as $article) {
        $ids .= ','.$article['aid'];
        $num++;
    }
}
这段代码的作用是:如果通过标题搜索未找到结果,则尝试通过文章内容进行模糊匹配。
### 步骤 3:更新缓存 完成上述修改后,登录Discuz后台,更新缓存。然后测试搜索功能,验证是否可以成功检索到文章内容。
### 注意事项 1. **性能问题**:由于使用了`LIKE`语句,当数据量较大时,可能会导致查询效率降低。建议结合全文索引工具(如Sphinx)进一步优化。 2. **兼容性**:本文基于Discuz X3.1版本(20140101)编写,请确保您的站点版本与此一致。 3. **备份文件**:在修改任何核心文件前,请务必做好备份,以免出现不可逆的问题。
通过以上步骤,您可以轻松实现Discuz门户文章的全文检索功能,为用户提供更加精准和便捷的搜索体验。希望这篇文章对您有所帮助!