php全文检索实现
PHP 全文检索实现方法
使用 MySQL 全文索引
MySQL 的 MyISAM 和 InnoDB 引擎支持全文索引功能。在创建表时可以为特定列添加全文索引。
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT(title, content)
) ENGINE=InnoDB;
执行全文搜索查询:
$searchTerm = "数据库";
$query = "SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:search IN NATURAL LANGUAGE MODE)";
$stmt = $pdo->prepare($query);
$stmt->bindParam(':search', $searchTerm);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
使用 Elasticsearch
Elasticsearch 是专业的全文搜索引擎,需要先安装并配置 Elasticsearch 服务。
安装 Elasticsearch PHP 客户端:
composer require elasticsearch/elasticsearch
创建索引并搜索:
require 'vendor/autoload.php';
$client = Elastic\Elasticsearch\ClientBuilder::create()->build();
// 索引文档
$params = [
'index' => 'articles',
'id' => '1',
'body' => [
'title' => 'PHP全文检索',
'content' => '实现全文检索的多种方法'
]
];
$response = $client->index($params);
// 搜索文档
$params = [
'index' => 'articles',
'body' => [
'query' => [
'match' => [
'content' => '全文检索'
]
]
]
];
$response = $client->search($params);
使用 Sphinx 搜索引擎
Sphinx 是另一个流行的全文搜索引擎,性能优异。
安装 Sphinx 并配置:
sudo apt-get install sphinxsearch
PHP 中使用 Sphinx:
$sphinx = new SphinxClient();
$sphinx->SetServer("localhost", 9312);
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
$sphinx->SetLimits(0, 20);
$result = $sphinx->Query("全文检索", "articles");
使用 SQLite 的 FTS
SQLite 提供 FTS(全文搜索)扩展模块,适合小型应用。
创建虚拟表:
CREATE VIRTUAL TABLE documents USING fts5(title, content);
PHP 中搜索:
$db = new PDO('sqlite:database.db');
$stmt = $db->prepare("SELECT * FROM documents WHERE documents MATCH :query");
$stmt->bindValue(':query', '全文检索');
$stmt->execute();
$results = $stmt->fetchAll();
使用纯 PHP 实现简单搜索
对于非常小的数据集,可以用 PHP 数组实现简单搜索:

function searchInArray($array, $query) {
return array_filter($array, function($item) use ($query) {
return stripos($item['title'], $query) !== false
|| stripos($item['content'], $query) !== false;
});
}
$articles = [/* 文章数组 */];
$results = searchInArray($articles, 'PHP');
性能优化建议
- 为大型数据集选择专业搜索引擎如 Elasticsearch 或 Sphinx
- 对中文文本需要额外处理分词问题
- 考虑使用缓存机制存储热门搜索结果
- 定期维护和优化索引结构
每种方法各有优缺点,应根据项目规模、性能需求和技术栈选择最适合的方案。MySQL 全文索引适合中小型项目,Elasticsearch 适合大型复杂搜索需求,SQLite FTS 适合嵌入式应用,纯 PHP 实现仅适用于极小数据集。






