針對中型局域網 (約 5 萬頁面) 構建高性能、跨平台全文搜索引擎。採用 Java 爬蟲入庫、PHP 預處理索引、MySQL 存儲檢索的三層架構,搜索響應 2-10 秒,支持靜態/動態頁面 (PHP/ASP),可部署於 Windows/Linux 等任意平台。
LinkToDB) 從種子 URL 開始,廣度優先抓取鏈接,下載頁面存入 webpagelocal 表MakeFast.php) 提取標題、正文前 512 字節,去除 HTML 標籤,存入 webpagefindfast 表供快速搜索Search.php) 解析用戶查詢 (支持邏輯 AND/NOT、標題/正文範圍、快速/深度模式),生成 SQL 查詢,高亮關鍵詞顯示摘要-- 鏈接表:待抓取/已抓取 URL 管理
CREATE TABLE link (
Id INT UNSIGNED AUTO_INCREMENT,
Url VARCHAR(120) NOT NULL PRIMARY KEY,
Class TINYINT UNSIGNED DEFAULT 0, -- 深度層級
IsSearchLink TINYINT UNSIGNED DEFAULT 0, -- 是否已分析
UNIQUE KEY Id (Id), KEY Class (Class)
);
-- 頁面全量存儲表
CREATE TABLE webpagelocal (
Id INT UNSIGNED AUTO_INCREMENT,
Url VARCHAR(120) NOT NULL PRIMARY KEY,
Content TEXT NOT NULL,
UNIQUE KEY Id (Id)
);
-- 快速檢索索引表 (標題 + 前512字符)
CREATE TABLE webpagefindfast (
Id INT UNSIGNED NOT NULL,
Url VARCHAR(120) NOT NULL PRIMARY KEY,
Title VARCHAR(64),
Content BLOB, -- 存儲去標籤後的前512字符
KEY Title (Title)
);
StreamTokenizer 解析 HTML,提取 <a href=...>, <frame src=...> 等鏈接TreeMap 按 URL 排序計數link 表,未抓取頁面下載入 webpagelocal (限制 200KB)// 編譯運行
set CLASSPATH=d:\j\mm.mysql.jdbc2
javac LinkToDB.java
java LinkToDB [可選:限制域名前綴]
<?php
mysql_connect("localhost","root","mypassword");
$result = mysql_db_query("Spider",
"SELECT Id,Url,Content FROM webpagelocal WHERE Id>$n1 AND Id<$n2");
while($mt = mysql_fetch_array($result)) {
// 提取標題
$mt2 = strtoupper($mt[2]);
$PosTitleL = strpos($mt2,"<TITLE>");
$PosTitleR = strpos($mt2,"</TITLE>");
$Title = ($PosTitleL&&$PosTitleR) ? substr($mt[2],$PosTitleL+7,$PosTitleR-$PosTitleL-7) : "";
$Title = eregi_replace("'","’",$Title);
// 提取正文 (BODY/HEAD/TITLE 後內容)
$Body = ...; // 略
$BodyText = strip_tags($Body); // 去除 HTML 標籤
$BodyNoSpace = eregi_replace(" ","",$BodyText);
$BodyNoQuote = eregi_replace("'","",$BodyNoSpace);
$Body512 = substr($BodyNoQuote,0,511)." ";
// 寫入索引表
$sql = "INSERT INTO webpagefindfast(Id,Url,Title,Content)
VALUES($Id,'$Url','$Title','$Body512')";
mysql_db_query("Spider",$sql);
echo $Id." ";
}
?>
調用:https://host/Spider/MakeFast.php?n1=1&n2=10000 分批處理避免超時。
- 前綴 NOT)、搜索範圍 (標題/正文)、模式 (快速 512字符 / 深度 2048字符)Search.php 動態構建 SQL:LIKE '%kw%' / NOT LIKE '%kw%',LIMIT 100,分頁顯示前 20 條str_replace($kw, "<font color=red>$kw</font>", $snippet)One.php?num=Id 直接讀取 webpagelocal 原始頁面| 層面 | 現狀 | 優化方向 |
|---|---|---|
| 爬蟲 | 單線程、同步下載 | 多線程池、HTTP 持久連接、增量抓取 (Last-Modified/ETag) |
| 索引 | MySQL LIKE 全表掃描 | 全文索引、倒排索引、Sphinx/Lucene 專用搜索引擎 |
| 中文分詞 | 無,模糊匹配 | 集成 IKAnalyzer、MMSEG 等分詞器 |
| 架構 | PHP 直連 DB | 服務化、緩存熱點查詢、負載均衡 |
利用 Java 跨平台爬蟲、MySQL 可靠存儲、PHP 快速開發檢索界面,快速構建出可用的局域網搜索引擎。雖屬教學級實現,但架構清晰、技術棧成熟,為後續引入專業搜索引擎 (Elasticsearch/Solr) 奠定數據基礎。