# PHP如何實現關鍵字搜索功能
在現代Web應用中,搜索功能已成為不可或缺的核心功能之一。本文將詳細介紹PHP實現關鍵字搜索的多種技術方案,涵蓋從基礎SQL查詢到高級搜索引擎整合的全套解決方案。
## 一、基礎SQL搜索實現
### 1.1 LIKE基礎查詢
最簡單的搜索實現方式是使用SQL的LIKE語句:
```php
$keyword = $_GET['keyword'];
$sql = "SELECT * FROM articles WHERE title LIKE '%".$keyword."%'";
$result = $conn->query($sql);
安全注意事項: - 必須使用預處理語句防止SQL注入 - 避免直接拼接用戶輸入
改進后的安全版本:
$stmt = $conn->prepare("SELECT * FROM articles WHERE title LIKE ?");
$searchTerm = "%".$keyword."%";
$stmt->bind_param("s", $searchTerm);
擴展搜索到多個字段:
$stmt = $conn->prepare("
SELECT * FROM products
WHERE name LIKE ?
OR description LIKE ?
OR category LIKE ?
");
$searchTerm = "%".$keyword."%";
$stmt->bind_param("sss", $searchTerm, $searchTerm, $searchTerm);
對于較大數據量,LIKE查詢性能較差,可使用MySQL的FULLTEXT索引:
-- 創建全文索引
ALTER TABLE articles ADD FULLTEXT(title, content);
PHP查詢實現:
$stmt = $conn->prepare("
SELECT *, MATCH(title, content) AGNST(? IN NATURAL LANGUAGE MODE) AS score
FROM articles
WHERE MATCH(title, content) AGNST(? IN NATURAL LANGUAGE MODE)
ORDER BY score DESC
");
支持更復雜的搜索邏輯:
$stmt = $conn->prepare("
SELECT * FROM articles
WHERE MATCH(title, content) AGNST(? IN BOOLEAN MODE)
");
// 搜索包含"PHP"但不包含"Java"的結果
$keyword = "+PHP -Java";
安裝Elasticsearch PHP客戶端:
composer require elasticsearch/elasticsearch
基本搜索實現:
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'articles',
'body' => [
'query' => [
'match' => [
'title' => $keyword
]
]
]
];
$response = $client->search($params);
實現分面搜索:
$params = [
'index' => 'products',
'body' => [
'query' => [...],
'aggs' => [
'categories' => [
'terms' => ['field' => 'category']
],
'price_ranges' => [
'range' => [
'field' => 'price',
'ranges' => [
['to' => 50],
['from' => 50, 'to' => 100],
['from' => 100]
]
]
]
]
]
];
中文需要特殊分詞處理,常用方案:
安裝Jieba分詞:
composer require fukuball/jieba-php
使用示例:
require_once "vendor/autoload.php";
use Fukuball\Jieba\Jieba;
use Fukuball\Jieba\Finalseg;
Jieba::init();
Finalseg::init();
$seg_list = Jieba::cut("這是一個伸手不見五指的黑夜");
print_r($seg_list);
MySQL實現:
function highlightKeywords($text, $keyword) {
$words = explode(' ', $keyword);
foreach ($words as $word) {
$text = preg_replace(
"/($word)/i",
'<span class="highlight">$1</span>',
$text
);
}
return $text;
}
Elasticsearch高亮:
$params = [
'body' => [
'query' => [...],
'highlight' => [
'fields' => [
'content' => new \stdClass()
]
]
]
];
實現簡單”您是不是要找”功能:
function getSearchSuggestions($keyword) {
$similarWords = [];
$allKeywords = getAllPopularKeywords(); // 從數據庫獲取熱門關鍵詞
foreach ($allKeywords as $word) {
similar_text($keyword, $word, $percent);
if ($percent > 70) {
$similarWords[] = $word;
}
}
return array_slice($similarWords, 0, 5);
}
使用Redis緩存熱門搜索結果:
$redis = new Redis();
$redis->connect('127.0.0.1');
$cacheKey = 'search:'.md5($keyword);
if ($redis->exists($cacheKey)) {
return json_decode($redis->get($cacheKey));
} else {
// 執行數據庫查詢
$redis->setex($cacheKey, 3600, json_encode($results));
}
function filterSensitiveWords($content) {
$sensitiveWords = ['暴力', '色情', '賭博'];
return str_replace($sensitiveWords, '***', $content);
}
根據應用場景選擇合適的技術方案: - 小型應用:MySQL全文搜索 - 中型應用:Elasticsearch - 中文內容:結合分詞組件 - 高并發場景:加入緩存層
實際開發中,往往需要組合多種技術才能達到最優的搜索體驗。建議從簡單方案開始,隨著數據量增長逐步升級搜索架構。 “`
這篇文章涵蓋了從基礎到高級的PHP搜索實現方案,包含了約1900字的技術內容,采用Markdown格式編寫,包含代碼示例和技術要點說明。您可以根據實際需求調整或擴展特定部分的內容。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。