Xiuno BBS 重构记录贴(八)帖子全文搜索功能
贰先生 2小时前

# 帖子全文搜索功能 Spec

## Why
当前搜索功能使用 `LIKE '%keyword%'` 模糊查询,仅搜索帖子标题,性能差且无法搜索帖子内容。需要升级为 MySQL FULLTEXT 全文索引,支持标题+内容搜索,提升搜索性能和用户体验。

## What Changes
-`bbs_thread.subject``bbs_post.message` 添加 FULLTEXT 索引
- 重写 `route/search.php`,使用 `MATCH...AGAINST` 替代 `LIKE`,同时搜索标题和内容
- 重写 `view/htm/search.htm`,增加内容搜索结果展示、关键词高亮、搜索结果摘要
- 优化顶部导航搜索入口,增加 htmx 实时搜索建议
- 添加搜索安全过滤(XSS、SQL 注入防护)
- 更新语言文件

## Impact
- Affected code: `route/search.php`, `view/htm/search.htm`, `view/htm/header_nav.inc.htm`, `install/upgrade.sql`, `lang/zh-cn/bbs_search.php`
- 数据库变更:需执行 ALTER TABLE 添加 FULLTEXT 索引
- 现有搜索行为变更:从仅搜标题变为标题+内容联合搜索

## ADDED Requirements

### Requirement: FULLTEXT 全文索引
系统 SHALL 为 `bbs_thread` 表的 `subject` 字段和 `bbs_post` 表的 `message` 字段添加 MySQL FULLTEXT 索引,使用 `utf8_general_ci` 排序规则。

#### Scenario: 索引创建
- **WHEN** 执行升级 SQL
- **THEN** `bbs_thread` 表拥有 `ft_subject` FULLTEXT 索引(subject 字段),`bbs_post` 表拥有 `ft_message` FULLTEXT 索引(message 字段)

### Requirement: FULLTEXT 搜索逻辑
系统 SHALL 使用 MySQL FULLTEXT 自然语言模式(`IN NATURAL LANGUAGE MODE`)进行搜索,同时搜索帖子标题和帖子内容。

#### Scenario: 搜索帖子标题
- **WHEN** 用户搜索关键词匹配某帖子标题
- **THEN** 该帖子出现在搜索结果中,标题中的关键词被高亮

#### Scenario: 搜索帖子内容
- **WHEN** 用户搜索关键词匹配某帖子内容(message 字段)
- **THEN** 该帖子出现在搜索结果中,内容摘要中的关键词被高亮

#### Scenario: 搜索结果排序
- **WHEN** 返回搜索结果
- **THEN** 结果按 FULLTEXT 相关度排序(MATCH...AGAINST 返回的相关度分数)

#### Scenario: 空关键词
- **WHEN** 用户提交空关键词
- **THEN** 显示搜索页面,不执行查询

#### Scenario: 关键词过短
- **WHEN** 用户提交的关键词少于 2 个字符
- **THEN** 提示关键词过短,不执行查询

### Requirement: 搜索结果展示
系统 SHALL 在搜索结果中展示匹配帖子的标题、内容摘要(截取关键词前后各 80 字符)、所属版块、发帖时间、回复数,并对标题和摘要中的关键词进行高亮标记。

#### Scenario: 标题高亮
- **WHEN** 搜索结果的标题包含关键词
- **THEN** 关键词被 `<mark>` 标签包裹高亮显示

#### Scenario: 内容摘要
- **WHEN** 搜索结果匹配的是帖子内容
- **THEN** 显示内容摘要,截取关键词所在位置前后各约 80 字符,关键词被 `<mark>` 标签高亮

### Requirement: 搜索分页
系统 SHALL 使用 Bootstrap 5 分页组件展示搜索结果分页,每页显示数量与系统默认 pagesize 一致。

#### Scenario: 分页导航
- **WHEN** 搜索结果超过一页
- **THEN** 底部显示 Bootstrap 5 分页组件,支持页码导航

### Requirement: 搜索安全过滤
系统 SHALL 对搜索关键词进行安全过滤,防止 XSS 和 SQL 注入。

#### Scenario: XSS 防护
- **WHEN** 用户输入包含 HTML/JS 标签的关键词
- **THEN** 过滤掉 `<`, `>`, `"`, `'`, `&`, `#`, `` ` `` 等危险字符后再执行搜索

#### Scenario: SQL 注入防护
- **WHEN** 用户输入包含 SQL 注入尝试的关键词
- **THEN** 使用参数化查询或 `addslashes()` 转义后再拼接 SQL

### Requirement: 顶部导航搜索优化
系统 SHALL 优化顶部导航栏的搜索入口,支持 htmx 实时搜索建议。

#### Scenario: 实时搜索建议
- **WHEN** 用户在导航栏搜索框输入关键词(输入停顿 300ms 后)
- **THEN** 通过 htmx 请求搜索建议,在搜索框下方显示下拉列表,展示最多 5 条匹配帖子标题

#### Scenario: 移动端搜索
- **WHEN** 用户在移动端点击搜索图标
- **THEN** 跳转到搜索页面

### Requirement: 搜索类型切换
系统 SHALL 保留现有的搜索类型切换功能(帖子/用户),帖子搜索使用 FULLTEXT,用户搜索保持 LIKE 方式。

#### Scenario: 帖子搜索
- **WHEN** 搜索类型为 thread
- **THEN** 使用 FULLTEXT 搜索帖子标题和内容

#### Scenario: 用户搜索
- **WHEN** 搜索类型为 user
- **THEN** 使用 LIKE 搜索用户名

## MODIFIED Requirements

### Requirement: 搜索路由
原有搜索路由 `route/search.php` 使用 LIKE 查询仅搜索标题,现改为 FULLTEXT 查询搜索标题+内容,并增加内容摘要提取逻辑。

## REMOVED Requirements
最新回复 (0)
全部楼主
返回