首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

使用 PHPdig 建立專屬垂直搜尋引擎:安裝、配置與中文優化指南

     編輯:PHP 相關知識

PHPdig 是以 PHP 開發的開源全文檢索引擎,適合建立垂直領域搜尋服務(如技術文檔、電商商品、知識庫)。本文記錄安裝配置流程、蜘蛛爬取設定、中文分詞優化與常見問題解決。

什麼是 PHPdig?

  • PHP 原生實作,無需 Java/Go 等額外運行環境
  • 支援 HTML、PDF、DOC、XLS、TXT 等格式索引
  • 內建 Spider 爬蟲、索引器、搜尋前端
  • 適合中小型資料量(百萬文檔以內)的垂直搜尋

安裝步驟

1. 環境需求

  • PHP 7.4+(建議 8.1+),需啟用:mysqli、mbstring、gd、curl、dom、simplexml、zip
  • MySQL 5.7+ / MariaDB 10.3+
  • Apache/Nginx + mod_rewrite
  • 外部工具:`pdftotext` (poppler-utils)、`catdoc`、`xlhtml`、`unzip`、`lynx`/`wget`

2. 取得原始碼

# 官方已停止維護,建議使用社群維護版
git clone https://github.com/phpdig/phpdig.git
cd phpdig
composer install # 若有 composer.json

3. 資料庫建立

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';

4. 配置檔案 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 使用簡單的字元切割,中文效果極差。必須整合結巴分詞:

1. 安裝 PHP 結巴分詞擴充

# 方法一: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

2. 修改索引器 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) {
        // 寫入索引表...
    }
}
?>

爬蟲管理介面操作

  1. 登入 `https://search.example.com/admin/`
  2. 「新增網站」輸入起始 URL(如 `https://docs.example.com/`)
  3. 設定爬取深度(建議 2-3)、每頁連結數(建議 30-50)
  4. 點擊「開始爬取」,監控進度頁面
  5. 完成後至「搜尋測試」驗證結果

搜尋前端客製化

修改搜尋模板 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

效能優化建議

  • 啟用 MySQL 查詢快取、調整 `innodb_buffer_pool_size`
  • 為索引表加入全文索引(MySQL 5.6+ 原生支援)
  • 使用 Redis 快取熱門搜尋結果
  • 靜態化搜尋首頁、熱門關鍵字頁
  • 考慮遷移至 Elasticsearch/Meilisearch 當資料量超過 50 萬文檔

常見問題排查

問題可能原因解決方案
爬取無結果User-Agent 被擋、需登入、JS 渲染設定 User-Agent、配置 Cookie、改用 Headless Chrome
中文搜尋不準未整合分詞、字典不全整合結巴分詞、載入自定義詞典
PDF 無法索引缺少 pdftotext`apt install poppler-utils` 並確認路徑
爬取速度慢延遲設定過大、無快取調整 SPIDER_DELAY、啟用 HTTP 快取
記憶體耗盡大文檔處理、遞迴過深增加 memory_limit、限制文檔大小

PHPdig 雖非企業級搜尋引擎,但對中小型垂直搜尋需求足夠。關鍵在於中文分詞整合與爬蟲策略調優。若需求增長,建議規劃遷移至 Meilisearch(輕量級)或 Elasticsearch(功能完整)以獲得更好擴展性與搜尋品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved