dede搜索框如何实现关键字搜索功能?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 DEDE建站 正文
  1. 前端搜索框表单
  2. 后端PHP接收关键字
  3. 核心搜索逻辑(search.php
  4. 搜索结果模板
  5. 常见问题与自定义修改

前端搜索框表单

在 DedeCMS 的默认模板中,搜索框通常位于 templets/default/search.htm 文件里,它的 HTML 表单结构如下:

dede 搜索框搜索关键字
(图片来源网络,侵删)
<form name="formsearch" action="{dede:global name='cfg_phpurl'/}/search.php" method="get">
    <div class="form">
        <h4>搜索</h4>
        <input type="hidden" name="kwtype" value="0" />
        <input type="text" name="q" class="search-keyword" id="keyword" />
        <select name="searchtype" class="search-option">
            <option value="title" selected='1'>标题</option>
            <option value="title,keyword">标题+关键词</option>
        </select>
        <button type="submit" class="search-submit">搜索</button>
    </div>
</form>

关键点解析:

  • action="{dede:global name='cfg_phpurl'/}/search.php":表单数据会被提交到网站根目录下的 phpurl(默认是 /plus/)中的 search.php 文件。
  • method="get":使用 GET 方式提交,这意味着搜索关键字会直接显示在 URL 中,.../search.php?q=织梦CMS
  • <input type="text" name="q" ...>:这是用户输入搜索关键字的核心输入框。name="q" 是固定的,search.php 文件会通过 $_GET['q'] 来获取这个值。
  • <input type="hidden" name="kwtype" value="0" />:这是一个隐藏字段,用于定义关键字的类型。0 代表普通关键字,1 代表高级搜索(模糊匹配),2 代表精确匹配,你可以通过修改这里的值来改变搜索的精确度。
  • <select name="searchtype" ...>:这个下拉框让用户选择搜索范围。
    • value="title":只搜索文章标题。
    • value="title,keyword":搜索文章标题和关键词。

后端PHP接收关键字

当用户点击搜索按钮后,浏览器会将表单数据发送到 plus/search.php,这个文件是 DedeCMS 搜索功能的核心。

search.php 的开头部分,你会看到类似这样的代码:

// 获取搜索关键字
$keyword = trim($_GET['q']);
// 获取搜索类型
$searchtype = isset($_GET['searchtype']) ? trim($_GET['searchtype']) : 'title';
// 获取关键字类型
$kwtype = isset($_GET['kwtype']) ? intval($_GET['kwtype']) : 0;
// ... 其他处理

这里,$_GET['q'] 就是从前端表单 name="q" 的输入框中获取到的用户输入的搜索关键字。

dede 搜索框搜索关键字
(图片来源网络,侵删)

核心搜索逻辑(search.php

获取到关键字后,search.php 会进行一系列处理,然后构建 SQL 查询语句去数据库中搜索匹配的内容。

主要步骤:

  1. 关键字处理:对 $keyword 进行安全过滤和转义,防止 SQL 注入。
  2. 构建 SQL WHERE 子句:这是最关键的一步,程序会根据 $searchtype$kwtype 的值来动态生成 WHERE 条件。
    • $searchtypetitle:生成的 WHERE 子句可能类似于 WHERE arctitle LIKE '%织梦CMS%'
    • $searchtypetitle,keyword:生成的 WHERE 子句可能类似于 WHERE (arctitle LIKE '%织梦CMS%' OR arckeywords LIKE '%织梦CMS%')
    • $kwtype2 (精确匹配):生成的 WHERE 子句会使用 而不是 LIKEWHERE arctitle = '织梦CMS'
  3. 执行查询:将构建好的 SQL 语句发送到数据库执行,获取匹配的文章列表。
  4. 分页处理:如果搜索结果很多,程序会进行分页处理,计算总页数、当前页等。
  5. 传递数据到模板:程序将搜索结果、分页信息等数据打包,传递给搜索结果模板文件进行渲染。

搜索结果模板

搜索结果的展示页面是由模板文件控制的,默认的模板文件是 templets/default/search.htm

你可以在这个模板文件中使用 DedeCMS 的模板标签来循环显示搜索结果,

dede 搜索框搜索关键字
(图片来源网络,侵删)
{dede:global name='keyword'/}  <!-- 显示用户搜索的关键字 -->
<div class="search_results">
    <ul>
        {dede:list pagesize='10'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>
            <span class="info">([field:pubdate function="MyDate('Y-m-d',@me)"/])</span>
            <p>[field:description/]...</p>
        </li>
        {/dede:list}
    </ul>
</div>
<!-- 分页条 -->
<div class="page">
    {dede:pagelist listsize='4'/}
</div>

常见问题与自定义修改

问题1:搜索结果不准确或为空怎么办?

  1. 检查数据库:确保你的文章标题或关键词中确实包含你搜索的文字。
  2. 检查全文索引:DedeCMS 的默认搜索是基于 LIKE '%关键词%' 的,它不依赖数据库的全文索引,所以性能可能不高,但兼容性好,如果需要更强大的搜索,可以考虑集成 Elasticsearch 或 Sphinx 等专业搜索引擎。
  3. 检查模板标签:在 search.htm 中,确保使用了 {dede:list} 标签来循环输出结果。

问题2:如何修改搜索范围?

假设你想让搜索范围不仅包括“标题”和“标题+关键词”,还要包括“文章内容”。

  1. 修改前端模板 (search.htm): 在 <select name="searchtype"> 中添加一个新的 option

    <select name="searchtype" class="search-option">
        <option value="title">标题</option>
        <option value="title,keyword">标题+关键词</option>
        <option value="body">文章内容</option> <!-- 新增 -->
    </select>
  2. 修改后端逻辑 (plus/search.php): 找到处理 $searchtype 的代码段,增加对 body 的判断。

    // 在 search.php 中找到类似下面的代码块
    if($searchtype=='title')
    {
        $addquery = " AND (arc.title LIKE '%$keyword%')";
    }
    elseif($searchtype=='title,keyword')
    {
        $addquery = " AND (arc.title LIKE '%$keyword%' OR arc.keywords LIKE '%$keyword%')";
    }
    // 新增对 'body' 的处理
    elseif($searchtype=='body')
    {
        $addquery = " AND (arc.title LIKE '%$keyword%' OR arc.keywords LIKE '%$keyword%' OR arc.body LIKE '%$keyword%')";
    }
    else
    {
        $addquery = " AND arc.title LIKE '%$keyword%'";
    }

    注意:这里的 arc.body 是一个假设的字段名,你需要检查你的 dede_archives 表中存储文章内容的字段名,通常是 bodycontent

问题3:如何修改搜索结果的排序?

默认情况下,搜索结果可能按发布时间倒序排列,如果你想按相关度或点击量排序,需要修改 search.php 中的 SQL 查询语句。

找到构建 SQL 查询的地方,修改 ORDER BY 部分。

按点击量降序排列:

// 原来的 SQL 可能是
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl 
          FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id 
          WHERE $addquery $orderquery 
          LIMIT $startrow,$pagesize";
// 修改 $orderquery 部分
$orderquery = " ORDER BY arc.click DESC"; // 按点击量降序

DedeCMS 的搜索关键字处理流程是:用户在前端 name="q" 的输入框输入内容 -> 提交到 plus/search.php -> search.php 通过 $_GET['q'] 获取关键字 -> 根据其他参数构建 SQL 查询 -> 从数据库获取数据 -> 传递给 search.htm 模板进行渲染

理解了这个流程,你就可以根据需要自由地修改搜索功能,例如调整搜索范围、改变排序方式、优化搜索性能等。

-- 展开阅读全文 --
头像
dede数据库还原后为何为空?
« 上一篇 今天
C语言如何转换Unix时间戳?
下一篇 » 今天

相关文章

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

目录[+]