PHP实现简易文本搜索引擎:代码、索引与排序
针对无法使用复杂数据库搜索引擎(如 Elasticsearch)的小型网站或特定数据集场景,本文详解了如何使用 PHP 构建一个基于内存数组的轻量级文本搜索引擎。内容涵盖从数据预处理、关键字提取到结果排序的核心逻辑。
1. 准备搜索数据集
对于简易实现,我们可以将待搜索的文档数据直接存储在 PHP 数组中。在实际生产环境中,这部分数据通常来源于 MySQL 查询结果集或读取本地 TXT/Markdown 文件。
操作入口:脚本初始化部分
具体动作:定义包含 id、title 和 content 字段的数组结构,作为搜索的基础语料库。
$documents = [
['id' => 1, 'title' => 'PHP搜索引擎', 'content' => '创建一个简易的PHP搜索引擎。'],
['id' => 2, 'title' => 'PHP数组教程', 'content' => '学习PHP中数组的使用方法。'],
// 更多文档...
];2. 提取用户查询关键字
为了让计算机理解用户的输入,需要将自然语言查询转换为系统可识别的关键字列表。这一步需要进行大小写标准化、空格切分以及去重处理。
操作入口:自定义函数 extractKeywords()
具体动作:
- 将输入查询转为小写
strtolower($query)。 - 使用正则表达式
/\s+/以空白字符为界切割字符串。 - 利用
array_unique移除重复关键字。
function extractKeywords($query) {
$query = strtolower($query);
$keywords = preg_split('/\s+/', $query); // 基于空格分割查询为关键字
return array_unique($keywords); // 移除重复关键字
}3. 执行关键词匹配
匹配环节的核心逻辑是遍历所有文档,判断文档是否包含了查询中的所有关键字。这里采用“全匹配”策略,即要求必须同时存在所有提取出的关键字。
操作入口:searchDocuments() 函数
具体动作:
- 遍历
$documents数组中的每一个对象。 - 将每个文档的标题和内容拼接后转小写,存入变量
$docText。 - 内层循环检查每个
$keyword是否存在于$docText中(使用strpos !== false)。 - 若找到任何一个不存在的关键字,标记匹配失败;否则将该文档加入
$matches。
function searchDocuments($keywords, $documents) {
$matches = [];
foreach ($documents as $document) {
$docText = strtolower($document['title'] . ' ' . $document['content']);
$match = true;
foreach ($keywords as $keyword) {
if (strpos($docText, $keyword) === false) {
$match = false;
break;
}
}
if ($match) {
$matches[] = $document;
}
}
return $matches;
}4. 按相关性对结果排序
单纯找出匹配的文档是不够的,我们还需要按照相关度由高到低排列。简单的算法是计算关键字在文档中出现的总次数(频次越高,相关度可能越高),并利用 usort 进行降序排列。
操作入口:sortDocumentsByRelevance() 函数
重要参数:参与排序的计算依据是 substr_count 统计的结果。
function sortDocumentsByRelevance($keywords, $documents) {
usort($documents, function ($a, $b) use ($keywords) {
$aCount = $bCount = 0;
$aText = strtolower($a['title'] . ' ' . $a['content']);
$bText = strtolower($b['title'] . ' ' . $b['content']);
foreach ($keywords as $keyword) {
$aCount += substr_count($aText, $keyword);
$bCount += substr_count($bText, $keyword);
}
return $bCount <=> $aCount; // 降序排列
});
return $documents;
}5. 整合流程并呈现结果
完成上述模块化处理后,即可编写主流程脚本串联各个步骤。
操作步骤:
- 设定搜索目标:
$query = "PHP搜索"; - 调用
extractKeywords获取词表。 - 调用
searchDocuments筛选有效集合。 - 调用
sortDocumentsByRelevance确定顺序。
显示方式:最后通过 foreach 遍历输出标题与内容的 HTML 结构。
$query = "PHP搜索";
$keywords = extractKeywords($query);
$matchedDocuments = searchDocuments($keywords, $documents);
$sortedDocuments = sortDocumentsByRelevance($keywords, $matchedDocuments);
// 显示结果
foreach ($sortedDocuments as $document) {
echo "标题: " . htmlspecialchars($document['title']) . "<br>";
echo "内容: " . htmlspecialchars($document['content']) . "<br><br>";
}结论与局限
这种基于内存数组和基础字符串函数的实现方案,免去了配置 Lucene/Elasticsearch 的沉重开销,非常适合数据量极小的静态页或者内部工具类项目的快速原型开发。
风险提示:当数据量达到数万级以上时,此方法会面临严重的性能瓶颈(时间复杂度为 O(N*M)),届时建议转向 MySQL 全文索引、SQLite FTS5 模块或专业的搜索服务。
以上就是PHP实现基于文本的简易搜索引擎功能的详细内容,更多关于PHP简易搜索引擎的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













