PHPdig 是以 PHP 開發的開源全文檢索引擎,適合建立垂直領域搜尋服務(如技術文檔、電商商品、知識庫)。本文記錄安裝配置流程、蜘蛛爬取設定、中文分詞優化與常見問題解決。
# 官方已停止維護,建議使用社群維護版
git clone https://github.com/phpdig/phpdig.git
cd phpdig
composer install # 若有 composer.json
CREATE DATABASE phpdig CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'phpdig'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL ON phpdig.* TO 'phpdig'@'localhost';
config.php<?php
// 資料庫設定
define('DB_HOST', 'localhost');
define('DB_USER', 'phpdig');
define('DB_PASS', 'strong_password');
define('DB_NAME', 'phpdig');
define('DB_TABLE_PREFIX', 'phpdig_');
// 網站設定
define('SITE_URL', 'https://search.example.com');
define('ADMIN_USER', 'admin');
define('ADMIN_PASS', 'secure_admin_password'); // 請務必修改
// 爬蟲設定
define('SPIDER_DEPTH', 3); // 爬取深度
define('SPIDER_MAX_LINKS', 50); // 每頁最大連結數
define('SPIDER_DELAY', 1); // 請求延遲(秒)
define('SPIDER_USER_AGENT', 'PHPdig Bot 1.0 (+https://search.example.com/bot.html)');
// 索引設定
define('INDEX_MIN_WORD_LENGTH', 2);
define('INDEX_MAX_WORD_LENGTH', 30);
define('STEMMING_ENABLED', false); // 中文不需詞幹提取
// 中文支援關鍵設定
define('CHINESE_SEGMENTATION', true);
define('SEGMENTATION_DICT', __DIR__ . '/dict/jieba.dict.utf8'); // 需整合結巴分詞
?>
原版 PHPdig 使用簡單的字元切割,中文效果極差。必須整合結巴分詞:
# 方法一:Composer 純 PHP 版(效能較低)
composer require fukuball/jieba-php
# 方法二:C 擴充版(推薦,效能高)
git clone https://github.com/jieba/php-jieba.git
cd php-jieba
phpize && ./configure && make && sudo make install
echo "extension=jieba.so" >> /etc/php/8.1/mods-available/jieba.ini
phpenmod jieba
index_function.php<?php
// 在 index_function.php 中找到分詞邏輯,替換為:
function phpdig_segment_text($text) {
if (extension_loaded('jieba')) {
// C 擴充版
$jieba = new Jieba();
return $jieba->cut($text);
} elseif (class_exists('Fukuball\Jieba\Jieba')) {
// Composer 版
$jieba = new \Fukuball\Jieba\Jieba();
return $jieba->cut($text);
}
// 降級:英文按空格,中文按單字切割
return preg_split('/\s+/', $text, -1, PREG_SPLIT_NO_EMPTY);
}
// 索引建立時呼叫
$words = phpdig_segment_text($content);
foreach ($words as $word) {
if (mb_strlen($word) >= INDEX_MIN_WORD_LENGTH) {
// 寫入索引表...
}
}
?>
templates/search.html<form action="search.php" method="get" class="search-form">
<input type="text" name="query" placeholder="輸入關鍵字..." value="{{QUERY}}">
<select name="search_type">
<option value="and" {{AND_SELECTED}}>完全匹配 (AND)</option>
<option value="or" {{OR_SELECTED}}>任一匹配 (OR)</option>
<option value="phrase" {{PHRASE_SELECTED}}>精確短語</option>
</select>
<button type="submit">搜尋</button>
</form>
<div class="results">
{{RESULTS}}
</div>
<div class="pagination">
{{PAGINATION}}
</div>
templates/result.html<div class="result-item">
<h3><a href="{{URL}}">{{TITLE}}</a></h3>
<div class="snippet">{{SNIPPET}}</div>
<div class="meta">
<span>{{SITE}}</span>
<span>{{SIZE}}</span>
<span>{{DATE}}</span>
</div>
</div>
# /etc/cron.d/phpdig
# 每天凌晨 3 點重新索引
0 3 * * * www-data /usr/bin/php /var/www/phpdig/spider.php -u https://docs.example.com/ -d 3 -l 50 >> /var/log/phpdig_spider.log 2>&1
# 每小時增量更新(需支援增量爬取的修改版)
0 * * * * www-data /usr/bin/php /var/www/phpdig/spider_incremental.php >> /var/log/phpdig_incremental.log 2>&1
| 問題 | 可能原因 | 解決方案 |
|---|---|---|
| 爬取無結果 | User-Agent 被擋、需登入、JS 渲染 | 設定 User-Agent、配置 Cookie、改用 Headless Chrome |
| 中文搜尋不準 | 未整合分詞、字典不全 | 整合結巴分詞、載入自定義詞典 |
| PDF 無法索引 | 缺少 pdftotext | `apt install poppler-utils` 並確認路徑 |
| 爬取速度慢 | 延遲設定過大、無快取 | 調整 SPIDER_DELAY、啟用 HTTP 快取 |
| 記憶體耗盡 | 大文檔處理、遞迴過深 | 增加 memory_limit、限制文檔大小 |
PHPdig 雖非企業級搜尋引擎,但對中小型垂直搜尋需求足夠。關鍵在於中文分詞整合與爬蟲策略調優。若需求增長,建議規劃遷移至 Meilisearch(輕量級)或 Elasticsearch(功能完整)以獲得更好擴展性與搜尋品質。