PHP数据库全文索引与搜索
MySQL的全文索引可以在内容中快速搜索关键词。配合PHP可以实现高效的搜索功能。今天说说PHP中全文搜索的实现。
创建全文索引。
```php
$pdo->exec("ALTER TABLE articles ADD FULLTEXT INDEX ft_search (title, content)");
?>
自然语言模式搜索。
```php
$keyword = 'PHP编程';
$stmt = $pdo->prepare("
SELECT *, MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE) AS relevance
FROM articles
WHERE MATCH(title, content) AGAINST(:keyword IN NATURAL LANGUAGE MODE)
ORDER BY relevance DESC
LIMIT 20
");
$stmt->execute(['keyword' => $keyword]);
$results = $stmt->fetchAll();
echo "找到 " . count($results) . " 条结果\n";
?>
布尔模式支持更多操作符。
```php
$keyword = '+PHP +MySQL -JavaScript';
$stmt = $pdo->prepare("
SELECT *, MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE) AS relevance
FROM articles
WHERE MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE)
ORDER BY relevance DESC
LIMIT 20
");
$stmt->execute(['keyword' => $keyword]);
$results = $stmt->fetchAll();
// 布尔操作符
// + 必须包含
// - 不能包含
// * 通配符
// ~ 降低相关性
?>
搜索的高亮显示。
```php
function highlight(string $text, string $keyword): string
{
$keywords = explode(' ', $keyword);
foreach ($keywords as $word) {
$text = preg_replace("/({$word})/iu", '$1', $text);
}
return $text;
}
foreach ($results as &$row) {
$row['title_highlight'] = highlight($row['title'], $keyword);
$row['content_excerpt'] = highlight(mb_substr($row['content'], 0, 200), $keyword);
}
?>
分页搜索。
```php
function searchWithPagination(PDO $pdo, string $keyword, int $page = 1, int $perPage = 20): array
{
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("
SELECT *, MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE) AS relevance
FROM articles
WHERE MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE)
ORDER BY relevance DESC
LIMIT :limit OFFSET :offset
");
$stmt->execute(['keyword' => $keyword, 'limit' => $perPage, 'offset' => $offset]);
$results = $stmt->fetchAll();
$countStmt = $pdo->prepare("SELECT COUNT(*) FROM articles WHERE MATCH(title, content) AGAINST(:keyword IN BOOLEAN MODE)");
$countStmt->execute(['keyword' => $keyword]);
$total = (int)$countStmt->fetchColumn();
return [
'data' => $results,
'total' => $total,
'page' => $page,
'total_pages' => ceil($total / $perPage),
];
}
?>
搜索建议功能。
```php
function getSuggestions(PDO $pdo, string $prefix, int $limit = 10): array
{
$stmt = $pdo->prepare("
SELECT DISTINCT title FROM articles
WHERE title LIKE :prefix
LIMIT :limit
");
$stmt->execute(['prefix' => "{$prefix}%", 'limit' => $limit]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
$suggestions = getSuggestions($pdo, 'PHP');
print_r($suggestions);
?>
MySQL全文索引适合中小规模的搜索需求。数据量大时建议用Elasticsearch等专业搜索引擎。全文索引的性能比LIKE查询好得多,分词器的选择影响搜索准确性。
PHP数据库全文索引与搜索
张小明
前端开发工程师
Linux服务器上用Python版Locust跑网页并发测试的实操包:含脚本、截图和避坑提示
本文还有配套的精品资源,点击获取 简介:在Linux系统中快速启动Web服务压力测试,直接用pip install locust安装框架,配合besttest.py定义用户行为和HTTP请求逻辑,开箱即用。包里带6张真实操作截图(1.png到…
Vue3 + Naive UI 构建的轻量级网页IM系统,含完整前后端源码与WebSocket实时通信支持
本文还有配套的精品资源,点击获取 简介:基于 Vue3 Composition API 和 Naive UI 开发的网页端即时通讯系统,开箱即用,支持消息收发、在线状态显示、会话列表管理、未读消息计数等核心IM功能。前端采用 TypeScript 严格类型约束…
快速验证java代码灵感:无需本地安装,快马平台秒级构建运行环境
快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请构建一个用于快速验证java算法或工具类原型的快马项目。项目应预设一个干净的java开发环境。核心功能包括:一个可编辑的主类文件,用户能直接在其中编写或…
InternVideo视频基础模型:从零开始掌握视频理解三大核心任务
InternVideo视频基础模型:从零开始掌握视频理解三大核心任务 【免费下载链接】InternVideo [ECCV2024] Video Foundation Models & Data for Multimodal Understanding 项目地址: https://gitcode.com/gh_mirrors/in/InternVideo InternVideo是一个强大的…
DEM、普通航拍 / 卫星影像、高分遥感、倾斜摄影实景模型
目录 一、DEM(单波段栅格,数字高程模型) 是什么 常见格式(工程最常用) 怎么制作(3 种主流方式) 二、普通航拍影像 / 卫星影像(RGB 彩色,DOM) 是什么 常…
从Gen5到Gen6:聊聊PCIe 6.0的PAM4信号,对硬件工程师意味着什么?
从Gen5到Gen6:PCIe 6.0的PAM4信号对硬件设计的颠覆性挑战当大多数工程师还在消化PCIe 5.0的32 GT/s NRZ信号时,PCIe 6.0已经带着64 GT/s的PAM4技术呼啸而来。这不是简单的速率翻倍,而是一场从底层信号机制开始的革命——四电平脉冲幅度调制&a…