java搜索引擎mysql_用Java MySQL PHP轻松构建跨平台的搜索引擎
此搜索引擎適于在一個(gè)中等規(guī)模的局域網(wǎng)中使用,由于找到的網(wǎng)頁存在數(shù)據(jù)庫中,不僅可以索靜態(tài)的HTML頁面,可以搜索php、asp等動(dòng)態(tài)頁面。對(duì)于一個(gè)擁有5萬個(gè)網(wǎng)頁的系統(tǒng)(使用PII-400作為服務(wù)器),搜索響應(yīng)時(shí)間在2-10秒左右,完全可以滿足要求,由于Java、MySQL、PHP都是跨平臺(tái)的軟件,所以此搜索引擎不僅可以工作在Windows服務(wù)器上,而且也可以工作在Linux等其他系統(tǒng)中。
一、建立搜索引擎需要的數(shù)據(jù)庫和數(shù)據(jù)表。
首先建立數(shù)據(jù)庫:
c:\mysql\bin\> mysqladmin -uroot -pmypasswd create Spider
然后建立數(shù)據(jù)庫中的表結(jié)構(gòu)
c:\mysql\bin\> mysql -uroot -pmypasswd Spider < Spider.mysql
其中Spider.mysql為一個(gè)文本文件,其內(nèi)容如下:
CREATE TABLE link (
Id int(10) unsigned NOT NULL auto_increment,
Url varchar(120) NOT NULL,
Class tinyint(3) unsigned NOT NULL default 0 ,
IsSearchLink tinyint(3) unsigned default 0,
PRIMARY KEY (Url),
UNIQUE Id (Id),
KEY Url (Url),
KEY Class (Class)
);
# 本局域網(wǎng)的初始主頁地址,搜索蜘蛛從此網(wǎng)址開始搜索所有其他網(wǎng)頁
INSERT INTO link VALUES( '1', 'HTTP://102.211.69.1/', '0', '0');
# 數(shù)據(jù)表 webpagelocal 用來存放下載的所有的網(wǎng)頁
CREATE TABLE webpagelocal (
Id int(10) unsigned NOT NULL auto_increment,
Url varchar(120) NOT NULL,
Content text NOT NULL,
PRIMARY KEY (Url),
UNIQUE Id (Id),
KEY Url (Url)
);
# 數(shù)據(jù)表 webpagefindfast
# 用MakeFast.php從表webpagelocal中提取512字節(jié)的檢索信息存放其中
CREATE TABLE webpagefindfast (
Id int(10) unsigned NOT NULL,
Url varchar(120) NOT NULL,
Title varchar(64),
Content blob,
PRIMARY KEY (Url),
KEY Url (Url),
KEY Title (Title)
);
二、以下為搜索網(wǎng)頁和下載網(wǎng)頁至本地?cái)?shù)據(jù)庫的Java程序LinkToDB.java,它也是此搜索引擎的核心和基礎(chǔ)
/***************************** LinkToDB.java ***********************************
*
* 對(duì)URL中的http鏈接進(jìn)行分析,將相對(duì)路徑轉(zhuǎn)換為絕對(duì)路徑,排序方式輸出結(jié)果到數(shù)據(jù)庫
*
* 如果分析得到的URL是Link表中唯一的,就將其內(nèi)容下載到表 WebPageLocal 中。
*
********************************************************************************
/
import java.io.*;
import java.util.*;
import java.net.*;
import java.lang.String;
import java.sql.*;
import java.text.*;
class Counter {
private int i = 1;
int read() { return i; }
void increment() { i ; }
}
public class LinkToDB {
String UrlHost = "";
String UrlFile = "";
String UrlPath = "";
static String StartWith = null;
boolean outsideTag = true; //判斷是否在標(biāo)記之中
static char[] buffer = new char[4096]; // 緩沖區(qū):用于保存從 URL 讀的數(shù)據(jù)
InputStreamReader read = null;
BufferedReader reader = null;
URLConnection uc = null;
private URL url = null;
private StreamTokenizer st;
private TreeMap counts = new TreeMap();//以排序方式保存找到的鏈接
LinkToDB(String myurl,String StartOnly){
try {
StartWith = StartOnly;
if(StartOnly!=null) { if(!myurl.startsWith(StartOnly)) return; }//只搜索此網(wǎng)站
url = new URL(myurl);
UrlHost = url.getHost();
UrlHost = UrlHost.toUpperCase();
UrlFile = url.getFile();
int v=UrlFile.lastIndexOf("/");
if(v!=-1) UrlPath = UrlFile.substring(0,v);
System.out.println("分析文件:" myurl);
int uclength=200000;
int ucError=0;
try{
uc = url.openConnection();
uc.setUseCaches(false);
uc.connect();
}
catch(IOException io) { ucError=1; System.out.println("打不開待分析網(wǎng)頁:" myu
rl); }
if(ucError!=1){
uclength = uc.getContentLength();
if (uclength<200000) {
try{ read = new InputStreamReader(url.openStream()); }
catch(IOException io) {System.out.println("流打開錯(cuò)誤:" myurl);}
}
else System.out.println("文件太大,不分析");
}
if(read!=null){
reader=new BufferedReader(read);
if(reader!=null){
st = new StreamTokenizer(reader);
st.resetSyntax(); // 重置語法表
st.wordChars(0,255); // 令牌范圍為全部字符
st.ordinaryChar('<'); // HTML標(biāo)記兩邊的分割符
st.ordinaryChar('>');
}
}
}
catch(MalformedURLException e){ System.out.println("Malformed URL String!");}
}
void cleanup() {
try { read.close(); }
catch(IOException e) { System.out.println("流關(guān)閉錯(cuò)誤"); }
}
void countWords() {
try {
while(st.nextToken()!=StreamTokenizer.TT_EOF) {
String s0="";
String s_NoCase="";
switch(st.ttype) {
case '<': //入標(biāo)記字段
outsideTag=false;
continue; //countWords();
case '>': //出標(biāo)記字段
outsideTag=true;
continue; //countWords();
case StreamTokenizer.TT_EOL: s0 = new String("EOL"); break;
case StreamTokenizer.TT_WORD: if(!outsideTag) s0 = st.sval; /*已經(jīng)是字符
串*/ break;
default: s0 = "";// s0 = String.valueOf[1]{ //以這些開始的都是超級(jí)鏈接
int HREF_POS = -1;
if(s0.startsWith("FRAME ")||s0.startsWith("IFRAME ")) {
HREF_POS = s0.indexOf("SRC=");
s0 = s0.substring(HREF_POS 4).trim();
s_NoCase=s_NoCase.substring(HREF_POS 4).trim();
}
else {
HREF_POS=s0.indexOf("HREF=");
s0=s0.substring(HREF_POS 5).trim();
s_NoCase=s_NoCase.substring(HREF_POS 5).trim();
}
if(HREF_POS!=-1) {
if(s0.startsWith("\""))
{s0=s0.substring(1);s_NoCase=s_NoCase.substring(1);}
int QUOTE=s0.indexOf("\"");
if(QUOTE!=-1)
{s0=s0.substring(0,QUOTE).trim();s_NoCase=s_NoCase.substring(0,QUOTE).trim
();}
int SPACE=s0.indexOf(" ");
if(SPACE!=-1)
{s0=s0.substring(0,SPACE).trim();s_NoCase=s_NoCase.substring(0,SPACE).trim
();}
if(s0.endsWith("\""))
{s0=s0.substring(0,s0.length()-1);s_NoCase=s_NoCase.substring(0,s_NoCase.l
ength()-1);}
if(s0.indexOf("'")!=-1||s0.indexOf("JAVASCRIPT:")!=-1||s0.indexOf("..")!=-1
)
{s0="";s_NoCase="";} //有這些符號(hào),認(rèn)為非合法鏈接;兩點(diǎn)表示上一目錄,而我
只想向下級(jí)查找
if ( !s0.startsWith("FTP://") &&//以下后綴或前綴通常非網(wǎng)頁格式
!s0.startsWith("FTP://") &&
!s0.startsWith("MAILTO:") &&
!s0.endsWith(".SWF") &&
!s0.startsWith("../")) //因../表示上一目錄,通常只需考慮本級(jí)和下N級(jí)目錄
s=s0;
if (!s.startsWith("HTTP://")&&!s.equals("")) {s=UrlHost UrlPath "/" s;s_No
Case=UrlHost UrlPath "/" s_NoCase;}
else if(s.startsWith("/")) {s=UrlHost s;s_NoCase=UrlHost s_NoCase;}
if(s.startsWith("HTTP://")) {s=s.substring(7);s_NoCase=s_NoCase.substring(
7);}
int JinHao=s.indexOf("#"); //如果含有"#"號(hào),表示有效的鏈接是此前的部分
if(JinHao!=-1) {s=s.substring(0,JinHao).trim();s_NoCase=s_NoCase.substring(
0,JinHao).trim();}
int H=-1; //以下將/./轉(zhuǎn)換為/
for(int m=0;m<4;m ){
H=s.indexOf("/./");
if(H!=-1) {s=s.substring(0,H) s.substring(H 2);s_NoCase=s_NoCase.substring
(0,H) s_NoCase.substring(H 2);}
}
int TwoXG=-1; //以下將//轉(zhuǎn)換為/
for(int m=0;m<5;m ){
TwoXG=s.indexOf("//");
if(TwoXG!=-1) {s=s.substring(0,TwoXG) s.substring(TwoXG 1);s_NoCase=s_NoCa
se.substring(0,TwoXG) s_NoCase.substring(TwoXG 1);}
}
int OneXG=s.indexOf("/");
if(OneXG==-1) {s=s "/";s_NoCase ="/";} //將xx.xx.xx.xxx轉(zhuǎn)換為xx.xx.xx.xxx/的
標(biāo)準(zhǔn)形式
總結(jié)
以上是生活随笔為你收集整理的java搜索引擎mysql_用Java MySQL PHP轻松构建跨平台的搜索引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#判断是否是节假日
- 下一篇: 伙伴分配器的内核实现