织梦 dede 搜索页

99ANYc3cd6
预计阅读时长 29 分钟
位置: 首页 织梦建站 正文
  1. 核心文件与工作流程
  2. 默认搜索页 (search.php) 的使用与局限
  3. 如何自定义搜索页(高级技巧)
  4. 搜索页常见问题与解决方案
  5. 优化搜索页性能与SEO

核心文件与工作流程

织梦搜索功能的实现依赖于几个关键文件:

织梦 dede 搜索页
(图片来源网络,侵删)
  • 前端入口文件:/plus/search.php

    • 这是用户提交搜索请求后访问的核心文件,它负责接收搜索关键词、处理分页、调用搜索逻辑,并将最终结果渲染出来。
    • 重要提示:所有对搜索页的修改,通常都是修改这个文件,或者基于它创建一个新的搜索模板。
  • 模板文件:/templets/default/search.htm

    • 这是 search.php 文件用来显示搜索结果的前端模板,你可以通过修改这个文件来改变搜索结果的展示样式,比如列表样式、摘要样式、分页样式等。
  • 搜索逻辑核心:/include/arc.searchview.class.php

    • 这是处理搜索逻辑的核心类,当 search.php 接收到请求后,会实例化这个类,并调用其方法来从数据库中查询数据、处理高亮、生成分页等。高级自定义搜索时,我们可能会修改这个类。
  • 数据库表:dede_search (或 #@__search)

    织梦 dede 搜索页
    (图片来源网络,侵删)
    • 这个表是织梦的全文索引表,当你在后台“更新缓存”时,织梦会把所有文章的标题、关键词、内容摘要等信息存入这个表,以加快搜索速度,搜索时,默认情况下就是在这个表里进行查询。

工作流程简图:

用户输入关键词 -> 提交到 /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) 的使用与局限

如何使用默认搜索页?

  1. 创建搜索表单:在你的网站模板(如 head.htmindex.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>
  2. 参数说明

    • q:搜索关键词(必需)。
    • kwtype:关键词匹配方式。
      • 0智能模糊搜索(默认),会同时匹配标题和内容,是织梦最常用的方式。
      • 1:精确匹配。
    • searchtype:搜索范围。
      • titlekeyword:智能搜索(标题和内容)。
      • title:仅搜索标题。
      • body:仅搜索内容。
    • typeid:按栏目ID搜索,如果你想只在某个栏目下搜索,可以加上这个参数。

默认搜索页的局限性

  1. 无法搜索自定义字段:默认搜索只针对系统自带的标题、关键词、内容摘要,如果你给文章模型增加了“品牌”、“产地”等自定义字段,默认搜索是无法找到这些字段的。
  2. 搜索结果样式单一search.htm 模板比较简单,无法满足复杂的布局需求。
  3. 性能问题:当数据量巨大时,对 dede_search 表的查询可能会变慢。
  4. 分页逻辑可能不完美:默认分页在某些特殊情况下可能不准确。

如何自定义搜索页(高级技巧)

这是最核心的部分,下面我们通过两个最常见的场景来讲解如何自定义搜索。

让搜索支持自定义字段

假设你的文章模型有一个自定义字段 brand (品牌),你希望搜索时也能搜到这个字段。

步骤 1:修改核心逻辑类 arc.searchview.class.php

  1. 打开文件 /include/arc.searchview.class.php

  2. 找到 function GetKeywordList($keyword) 方法(或类似名称的查询方法,具体版本可能略有不同)。

  3. 在该方法的 SQL 查询语句中,修改 SELECTFROM 部分。

    修改前 (默认只搜索 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

  1. 修改模板文件路径:在 my_search.php 中,找到 $tempfile = $cfg_basedir.$cfg_templets_dir."/default/search.htm"; 这一行,将其修改为你的新模板路径:

    $tempfile = $cfg_basedir.$cfg_templets_dir."/default/my_search.htm";
  2. 处理新增的筛选参数:在 my_search.php 中,接收并处理 typeidtime 参数,并加入到查询条件中。

    // 在 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.phparc.searchview.class.php 后不生效。

    • 原因
      1. 文件编码问题(如BOM头)。
      2. 缓存问题,浏览器或织梦自身缓存。
      3. 语法错误导致PHP执行失败。
    • 解决
      1. 用EditPlus等工具检查并去除BOM头。
      2. 清理浏览器缓存,或使用 Ctrl + F5 强制刷新。
      3. 检查PHP错误日志,看是否有语法错误。
  • 问题4:搜索页分页不正确。

    • 原因:通常是由于修改了查询逻辑但没有正确处理 TotalResult (总结果数) 变量。
    • 解决:在自定义的SQL查询后,务必执行 $this->TotalResult = $dsql->GetOne("SELECT COUNT(*) as dd FROM 你的表 WHERE 条件"); 来设置正确的总数。

优化搜索页性能与SEO

  • 性能优化

    1. 保持索引更新:这是最重要的一点,一个最新的索引能保证查询效率。
    2. 优化数据库:确保 dede_search 表和主表 #@__archives 的字段都有合适的索引(通常织梦会自动创建)。
    3. 减少不必要的查询:在自定义搜索逻辑时,避免使用 SELECT *,只查询你需要的字段。
    4. 使用更快的存储引擎:对于超大数据量的网站,可以考虑将数据库引擎从 MyISAM 改为 InnoDB,或者使用专门的搜索引擎如 Elasticsearch(但这需要较大的改动)。
  • SEO优化

    1. 设置 titlemeta 描述:在 search.php 中,可以根据搜索关键词动态设置页面的 titledescription,让搜索引擎认为这是一个有价值的页面。
      // 在 search.php 中
      $q = trim($_GET['q']);
      $title = $q ? "搜索“{$q}”的结果 - ". $cfg_webname : $cfg_webname;
      $description = $q ? "为您找到与“{$q}”相关的文章,共".$this->TotalResult."条结果。" : $cfg_webname;

      然后在 search.htm 模板的 <head> 部分调用这些变量。

    2. URL规范化:确保搜索结果的URL结构清晰、简洁。
    3. 提供“无结果”页面:当搜索结果为空时,显示一个友好的提示,并引导用户去其他热门页面或使用其他关键词。

希望这份详细的指南能帮助你全面掌握织梦搜索页的使用和自定义!

-- 展开阅读全文 --
头像
dede生成文档没反应怎么办?
« 上一篇 今天
织梦cn_substr如何正确使用?
下一篇 » 今天

相关文章

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

目录[+]