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

Java + MySQL + PHP 跨平台全文搜索引擎構建實戰

     編輯:Java 相關知識

針對中型局域網 (約 5 萬頁面) 構建高性能、跨平台全文搜索引擎。採用 Java 爬蟲入庫、PHP 預處理索引、MySQL 存儲檢索的三層架構,搜索響應 2-10 秒,支持靜態/動態頁面 (PHP/ASP),可部署於 Windows/Linux 等任意平台。

系統架構概覽

  • 爬蟲層:Java 程序 (LinkToDB) 從種子 URL 開始,廣度優先抓取鏈接,下載頁面存入 webpagelocal 表
  • 預處理層:PHP 腳本 (MakeFast.php) 提取標題、正文前 512 字節,去除 HTML 標籤,存入 webpagefindfast 表供快速搜索
  • 檢索層:PHP 前端 (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)
);

核心組件實現

1. Java 爬蟲 : LinkToDB.java

  • 使用 StreamTokenizer 解析 HTML,提取 <a href=...>, <frame src=...> 等鏈接
  • 相對路徑轉絕對路徑,過濾非 HTTP、JS、郵件、FTP、圖片等非頁面鏈接
  • 去重:利用 TreeMap 按 URL 排序計數
  • 新鏈接入 link 表,未抓取頁面下載入 webpagelocal (限制 200KB)
  • JDBC 連接 MySQL,批量提交,異常捕獲重試
// 編譯運行
set CLASSPATH=d:\j\mm.mysql.jdbc2
javac LinkToDB.java
java LinkToDB [可選:限制域名前綴]

2. PHP 索引構建 : MakeFast.php

<?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 分批處理避免超時。

3. 搜索前端 : SearchForm.htm + Search.php

  • 表單支持:關鍵詞 (空格分隔 AND,- 前綴 NOT)、搜索範圍 (標題/正文)、模式 (快速 512字符 / 深度 2048字符)
  • Search.php 動態構建 SQL:LIKE '%kw%' / NOT LIKE '%kw%',LIMIT 100,分頁顯示前 20 條
  • 摘要高亮:str_replace($kw, "<font color=red>$kw</font>", $snippet)
  • 深度模式智能截取:以首個關鍵詞為中心前後各 512 字符,避免中文截斷
  • 本地鏡像鏈接:One.php?num=Id 直接讀取 webpagelocal 原始頁面

性能與擴展建議

層面現狀優化方向
爬蟲單線程、同步下載多線程池、HTTP 持久連接、增量抓取 (Last-Modified/ETag)
索引MySQL LIKE 全表掃描全文索引、倒排索引、Sphinx/Lucene 專用搜索引擎
中文分詞無,模糊匹配集成 IKAnalyzer、MMSEG 等分詞器
架構PHP 直連 DB服務化、緩存熱點查詢、負載均衡

總結

利用 Java 跨平台爬蟲、MySQL 可靠存儲、PHP 快速開發檢索界面,快速構建出可用的局域網搜索引擎。雖屬教學級實現,但架構清晰、技術棧成熟,為後續引入專業搜索引擎 (Elasticsearch/Solr) 奠定數據基礎。

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