apache lucene-取得html內容建立索引檔

之前有介紹過怎麼讀取檔案來製作lucene的索引檔,這裡再提供另一個類似的方法,先從網路上取得網頁的html內容,有點像網路的爬蟲,爬取資料後再來建立索引檔。

程式有簡單的html資料取得的方式,需要更進階的方法可以參考URLConnection來實作get及post動作這一篇。

原始碼如下:

取得網頁資料建立索引內容

package testlucene;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import org.apache.lucene.document.Document;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

public class LuceneIndexHtml {

  private IndexWriter writer = null;

  // 做測試的網址
  private String url[] = { "http://catyku.pixnet.net/blog/post/22417532",
      "http://catyku.pixnet.net/blog/post/22393052",
      "http://catyku.pixnet.net/blog/post/22561736" };

  private Document doc = null;

  public LuceneIndexHtml() {
    try {
      // 建立index的寫入器
      // 使用標準的分詞器
      // 重新建立索引檔,也就是之前的檔案會全數重建
      writer = new IndexWriter("d:\\index", new StandardAnalyzer(), true);
      doc = new Document();
    } catch (Exception e) {

    }
  }

  private void setDocument(BufferedReader reader, String link) {
    Field field = new Field("content", reader);
    // 加入index文件檔裡,無法取得資訊
    doc.add(field);
    // 加入資訊,不做分詞,search不到此資訊,但可以取得
    doc.add(new Field("url", link, Field.Store.YES,
        Field.Index.UN_TOKENIZED));
  }

  private Document getDocument() {

    return doc;

  }

  // 把url的資料全都加入index裡
  public void writeToIndex() throws IOException {

    for (int i = 0; i < url.length; i++) {
      String sURL = url[i];
      // String sURL = "http://localhost:8080/TestJSP/index1.txt";
      URL lurl = new URL(sURL);
      URLConnection URLConn = (HttpURLConnection) lurl.openConnection();
      URLConn.setRequestProperty("User-agent", "IE/6.0");
      BufferedReader in = new BufferedReader(new InputStreamReader(
          URLConn.getInputStream()));
      System.out.println(url[i]);

      setDocument(in, url[i]);
      // in.close();
    }
    writer.addDocument(getDocument());
  }

  // 記得要關閉才會真的寫入檔案喔
  public void close() throws IOException {
    writer.close();
  }

  public static void main(String args[]) throws IOException {
    LuceneIndexHtml indexer = new LuceneIndexHtml();
    Date start = new Date();
    indexer.writeToIndex();
    Date end = new Date();
    System.out.println("建立索引用時" + (end.getTime() - start.getTime()) + "毫杪");
    indexer.close();
  }

}

另外寫一個搜尋程式,來查詢剛才建立的索引內容,比較詳細的說明可以參考apache lucene建立搜尋

package testlucene;

import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;

public class LuceneSearch {
  private IndexSearcher searcher = null;
  private Query query = null;
  private Analyzer analyzer = new StandardAnalyzer();

  public LuceneSearch() {
    try {
      // 建立查詢器
      searcher = new IndexSearcher(IndexReader.open("d:\\index"));

    } catch (Exception e) {

    }
  }

  // hits是查詢的結果集
  public final Hits search(String keyword) throws Exception {
    System.out.println("正在檢索關鍵字 : " + keyword);
    // 建立要查詢的("目標",分析器)
    QueryParser qp = new QueryParser("content", analyzer);
    // parse(查詢字) ,keyword可以用空白格開,理論上會查出
    // A AND B ,A,B 三種結果,放入同一個結果集
    // AND OR 大寫是logic判斷用
    query = qp.parse(keyword);
    Date start = new Date();
    // hits是查詢的結果集
    Hits hits = searcher.search(query);
    Date end = new Date();
    System.out
        .println("檢索完成,用時" + (end.getTime() - start.getTime()) + "毫杪");

    return hits;
  }

  // 列印結果集
  public void printResult(Hits h) {
    if (h.length() == 0) {
      System.out.println("對不起!沒有您要找的資料!");
    } else {
      // hits的length是查到的所有結果
      for (int i = 0; i < h.length(); i++) {
        try {
          // 取得第n個查詢結果,此處get("contents")會是null,
          // 因為content是查詢用欄位
          // 而get("path")則是敘述欄位
          // 請在建立index時就定義好
          Document doc = h.doc(i);
          // System.out.println("這是第"+(i+1)+"個檢索到的結果,檔案為 :
          // "+doc.get("path"));
          System.out.println(doc.get("url"));
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    System.out.println("---------------------------");
  }

  public static void main(String[] args) throws Exception {
    LuceneSearch test = new LuceneSearch();

    test.printResult(test.search("FileUpload"));

  }

}

2 thoughts to “apache lucene-取得html內容建立索引檔”

  1. 分詞修改有些問題想請教您
    我有使用您網站上面的教學
    為標準分詞器
    現在我想自己加索引不知道該怎麼去增加且修改

    是否能夠看到下面兩個例子的表格顯示???
    —————————————————-
    索引資料
    例:

    filename Content time

    http://www.sju.edu.tw 聖約翰科技大學 2011/06/05

    ———————————————————-

    權重
    例:

    字彙 數量

    聖 2
    約 1
    翰 5
    是 10

    ———————————————————-

發表迴響