熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

用Java+MySQL+PHP輕松構建跨平台的搜索引擎

2013-11-15 11:50:32  來源: JSP教程 

  此搜索引擎適於在一個中等規模的局域網中使用由於找到的網頁存在數據庫中不僅可以索靜態的HTML頁面可以搜索phpasp等動態頁面對於一個擁有萬個網頁的系統(使用PII作為服務器)搜索響應時間在秒左右完全可以滿足要求由於JavaMySQLPHP都是跨平台的軟件所以此搜索引擎不僅可以工作在Windows服務器上而且也可以工作在Linux等其他系統中
  一建立搜索引擎需要的數據庫和數據表
  首先建立數據庫
  c:\mysql\bin\> mysqladmin uroot pmypasswd create Spider
  然後建立數據庫中的表結構
  c:\mysql\bin\> mysql uroot pmypasswd Spider < Spidermysql
  其中Spidermysql為一個文本文件其內容如下
  CREATE TABLE link (
  Id int() unsigned NOT NULL auto_increment
  Url varchar() NOT NULL
  Class tinyint() unsigned NOT NULL default
  IsSearchLink tinyint() unsigned default
  PRIMARY KEY (Url)
  UNIQUE Id (Id)
  KEY Url (Url)
  KEY Class (Class)
  );
  # 本局域網的初始主頁地址搜索蜘蛛從此網址開始搜索所有其他網頁
  INSERT INTO link VALUES( HTTP:/// );
  # 數據表 webpagelocal 用來存放下載的所有的網頁
  CREATE TABLE webpagelocal (
  Id int() unsigned NOT NULL auto_increment
  Url varchar() NOT NULL
  Content text NOT NULL
  PRIMARY KEY (Url)
  UNIQUE Id (Id)
  KEY Url (Url)
  );
  # 數據表 webpagefindfast
  # 用MakeFastphp從表webpagelocal中提取字節的檢索信息存放其中
  CREATE TABLE webpagefindfast (
  Id int() unsigned NOT NULL
  Url varchar() NOT NULL
  Title varchar()
  Content blob
  PRIMARY KEY (Url)
  KEY Url (Url)
  KEY Title (Title)
  );
  二以下為搜索網頁和下載網頁至本地數據庫的Java程序LinkToDBjava它也是此搜索引擎的核心和基礎
  
  /***************************** LinkToDBjava ***********************************
  *
  * 對URL中的http鏈接進行分析將相對路徑轉換為絕對路徑排序方式輸出結果到數據庫
  *
  * 如果分析得到的URL是Link表中唯一的就將其內容下載到表 WebPageLocal 中
  *
  ********************************************************************************
  /
  import javaio*;
  import javautil*;
  import *;
  import javalangString;
  import javasql*;
  import javatext*;
  
  class Counter {
  private int i = ;
  int read() { return i; }
  void increment() { i++; }
  }
  
  public class LinkToDB {
  String UrlHost = ;
  String UrlFile = ;
  String UrlPath = ;
  static String StartWith = null;
  boolean outsideTag = true; //判斷是否在標記之中
  static char[] buffer = new char[]; // 緩沖區:用於保存從 URL 讀的數據
  InputStreamReader read = null;
  BufferedReader reader = null;
  URLConnection uc = null;
  private URL url = null;
  private StreamTokenizer st;
  private TreeMap counts = new TreeMap();//以排序方式保存找到的鏈接
  
  LinkToDB(String myurlString StartOnly){
  try {
  StartWith = StartOnly;
  if(StartOnly!=null) { if(!myurlstartsWith(StartOnly)) return; }//只搜索此網站
  url = new URL(myurl);
  UrlHost = urlgetHost();
  UrlHost = UrlHosttoUpperCase();
  UrlFile = urlgetFile();
  int v=UrlFilelastIndexOf(/);
  if(v!=) UrlPath = UrlFilesubstring(v);
  Systemoutprintln(分析文件+myurl);
  int uclength=;
  int ucError=;
  try{
  uc = urlopenConnection();
  ucsetUseCaches(false);
  nnect();
  }
  catch(IOException io) { ucError=; Systemoutprintln(打不開待分析網頁:+myu
  rl); }
  if(ucError!=){
  uclength = ucgetContentLength();
  if (uclength<) {
  try{ read = new InputStreamReader(urlopenStream()); }
  catch(IOException io) {Systemoutprintln(流打開錯誤:+myurl);}
  }
  else Systemoutprintln(文件太大不分析);
  }
  if(read!=null){
  reader=new BufferedReader(read);
  if(reader!=null){
  st = new StreamTokenizer(reader);
  stresetSyntax(); // 重置語法表
  stwordChars(); // 令牌范圍為全部字符
  stordinaryChar(); // HTML標記兩邊的分割符
  stordinaryChar();
  }
  }
  }
  catch(MalformedURLException e){ Systemoutprintln(Malformed URL String!);}
  }
  void cleanup() {
  try { readclose(); }
  catch(IOException e) { Systemoutprintln(流關閉錯誤); }
  }
  void countWords() {
  try {
  while(stnextToken()!=StreamTokenizerTT_EOF) {
  String s=;
  String s_NoCase=;
  switch(ype) {
  case : //入標記字段
  outsideTag=false;
  continue; //countWords();
  case : //出標記字段
  outsideTag=true;
  continue; //countWords();
  case StreamTokenizerTT_EOL: s = new String(EOL); break;
  case StreamTokenizerTT_WORD: if(!outsideTag) s = stsval; /*已經是字符
  串*/ break;
  default: s = ;// s = StringvalueOf((char)ype);/*單一字符*/
  }
  if(outsideTag) continue;//出了標記區域(<a >)
  String s = ;
  s_NoCase = strim();
  s=s_NoCasetoUpperCase();
  if(sstartsWith(A )||sstartsWith(AREA )||sstartsWith(FRAME )||ss
  tartsWith(IFRAME )){ //以這些開始的都是超級鏈接
  int HREF_POS = ;
  if(sstartsWith(FRAME )||sstartsWith(IFRAME )) {
  HREF_POS = sindexOf(SRC=);
  s = ssubstring(HREF_POS+)trim();
  s_NoCase=s_NoCasesubstring(HREF_POS+)trim();
  }
  else {
  HREF_POS=sindexOf(HREF=);
  s=ssubstring(HREF_POS+)trim();
  s_NoCase=s_NoCasesubstring(HREF_POS+)trim();
  }
  if(HREF_POS!=) {
  if(sstartsWith(\))
  {s=ssubstring();s_NoCase=s_NoCasesubstring();}
  int QUOTE=sindexOf(\);
  if(QUOTE!=)
  {s=ssubstring(QUOTE)trim();s_NoCase=s_NoCasesubstring(QUOTE)trim
  ();}
  int SPACE=sindexOf( );
  if(SPACE!=)
  {s=ssubstring(SPACE)trim();s_NoCase=s_NoCasesubstring(SPACE)trim
  ();}
  if(sendsWith(\))
  {s=ssubstring(slength());s_NoCase=s_NoCasesubstring(s_NoCasel
  ength());}
  if(sindexOf()!=||sindexOf(JAVASCRIPT:)!=||sindexOf()!=
  )
  {s=;s_NoCase=;} //有這些符號認為非合法鏈接兩點表示上一目錄而我
  只想向下級查找
  if ( !sstartsWith(FTP://) &&//以下後綴或前綴通常非網頁格式
  !sstartsWith(FTP://) &&
  !sstartsWith(MAILTO:) &&
  !sendsWith(SWF) &&
  !sstartsWith(/)) //因/表示上一目錄通常只需考慮本級和下N級目錄
  s=s;
  if (!sstartsWith(HTTP://)&&!sequals()) {s=UrlHost+UrlPath+/+s;s_No
  Case=UrlHost+UrlPath+/+s_NoCase;}
  else if(sstartsWith(/)) {s=UrlHost+s;s_NoCase=UrlHost+s_NoCase;}
  if(sstartsWith(HTTP://)) {s=ssubstring();s_NoCase=s_NoCasesubstring(
  );}
  int JinHao=sindexOf(#); //如果含有#表示有效的鏈接是此前的部分
  if(JinHao!=) {s=ssubstring(JinHao)trim();s_NoCase=s_NoCasesubstring(
  JinHao)trim();}
  int H=; //以下將//轉換為/
  for(int m=;m<;m++){
  H=sindexOf(//);
  if(H!=) {s=ssubstring(H)+ssubstring(H+);s_NoCase=s_NoCasesubstring
  (H)+s_NoCasesubstring(H+);}
  }
  int TwoXG=; //以下將//轉換為/
  for(int m=;m<;m++){
  TwoXG=sindexOf(//);
  if(TwoXG!=) {s=ssubstring(TwoXG)+ssubstring(TwoXG+);s_NoCase=s_NoCa
  sesubstring(TwoXG)+s_NoCasesubstring(TwoXG+);}
  }
  int OneXG=sindexOf(/);
  if(OneXG==) {s=s+/;s_NoCase+=/;} //將xxxxxxxxx轉換為xxxxxxxxx/的
  標准形式

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19732.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.