正文

Lucene学习笔记(一)2006-07-25 13:23:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/ggbm/16814.html

分享到:

     由于工作的需要,做以个搜索的功能,所以,准备用大名鼎鼎的LUCENE,在网上找了一些的资料,基本上看懂了点点,现将学习的代码贴出来,大家提提意见。。。
     我用的工具。
        eclipse3.1          http://www.eclipse.org
        lucene1.4           http://mirror.vmmatrix.net/apache/lucene/java/archive/lucene-1.4.3.jar
把jar文件放到classpath 里面就ok了。

下面开始编码:
1、CreateDataBase.java  

/**
 *@description 创建库文件
 *@package com.mysearch
 *@author  李国庆
 *@company  LEEMENZ
 *@version  1.0.0
 *@discription
 *
 */
package com.mysearch;

import java.io.File;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;

/**
 * @author Administrator
 *
 */
public class CreateDataBase {
 public CreateDataBase() {

 }

 /**
  *
  * @param file
  * @return
  */
 public int createDataBase(File file) {
  int returnValue = 0;
  if (!file.isDirectory()) {
   file.mkdirs();
  }
  try {
   IndexWriter indexWriter = new IndexWriter(file,
     new StandardAnalyzer(), true);
   indexWriter.close();
   returnValue = 1;
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return returnValue;
 }

 /**
  *传入检索库路径,初始化库
  * @paramfile
  * @return
  */
 public int createDataBase(String file) {
  return this.createDataBase(new File(file));
 }

 /*
  *
  *
  */
 public static void main(String[] args) {
  CreateDataBase temp = new CreateDataBase();
  if (temp.createDataBase("d:\\lucene\\holendb") == 1) {
   System.out.println("db init succ");
  }
 }
}


2、InsertRecords 添加索引
/**
 *@description 添加索引
 *@package com.mysearch
 *@author  李国庆
 *@company  LEEMENZ
 *@version  1.0.0
 *@discription
 *
 */
package com.mysearch;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

/**
 * @author Administrator
 *
 */
public class InsertRecords {
 public InsertRecords() {

 }

 /**
  *
  * @param dbpath 数据文件(INDEX)所在的路径
  * @param file   文件名
  * @return
  */
 public int insertRecords(String dbpath, File file) {

  int returnValue = 0;
  try {
   IndexWriter indexWriter = new IndexWriter(dbpath,
     new StandardAnalyzer(), false);
   this.addFiles(indexWriter, file);
   returnValue = 1;
  } catch (Exception ex) {
   ex.printStackTrace();
  }

  return returnValue;
 }

 /**
  * 传入需加载的文件名
  *
  * @paramfile  dbpath   需加载的文件路径
  * @return   file   需加载的文件名
  */
 public int insertRecords(String dbpath, String file) {

  return this.insertRecords(dbpath, new File(file));

 }

 /**
  * 建立索引
  * @param indexWriter  lucene内部对象,负责建立索引
  * @param file         文件名
  */
 public void addFiles(IndexWriter indexWriter, File file) {
  Document doc = new Document();
  try {
   doc.add(Field.Keyword("filename", file.getName()));
   // 以下两句只能取一句,前者是索引不存储,后者是索引且存储
   // doc.add(Field.Text("content",new FileReader(file)));
   doc.add(Field.Text("content", this.chgFileToString(file)));
   indexWriter.addDocument(doc);
   indexWriter.close();
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }

 /**
  * 从文本文件中读取内容
  *
  * @param file
  * @return string
  */
 public String chgFileToString(File file) {

  String returnValue = null;
  StringBuffer sb = new StringBuffer();
  char[] c = new char[4096];

  try {
   Reader reader = new FileReader(file);   //以reader的形式读取文件
   int n = 0;
   while (true) {
    n = reader.read(c);
    if (n > 0) {
     sb.append(c, 0, n);
    } else {
     break;
    }
   }
   reader.close();    //关闭流
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  returnValue = sb.toString();

  return returnValue;
 }

 /**
  *  执行插入数据操作
  * @param args
  */
 public static void main(String[] args) {

  InsertRecords temp = new InsertRecords();
  String dbpath = "d:\\lucene\\holendb";

  // holen1.txt中包含关键字"nationally"和"ggbm"
  if (temp.insertRecords(dbpath, "d:\\lucene\\nationally1.txt") == 1) {
   System.out.println("add file1 succ");
  }

  // holen2.txt中包含关键字"nationally"和"leo"
  if (temp.insertRecords(dbpath, "d:\\lucene\\nationally2.txt") == 1) {
   System.out.println("add file2 succ");
  }
  // holenalsdjflasdlfj.txt 中不包括关键字"nationally"
  if (temp.insertRecords(dbpath,
    "d:\\lucene\\nationallynalsdjflasdlfj.txt") == 1) {
   System.out.println("add file3 succ");
  }
 }
}

3、QueryRecords  测试查询
/**
 *@description 测试查询
 *@package com.mysearch
 *@author  李国庆
 *@company  LEEMENZ
 *@version  1.0.0
 *@discription
 *
 */
package com.mysearch;

import java.util.ArrayList;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;

/**
 * @author Administrator
 *
 */
public class QueryRecords {

 public QueryRecords(){
    }
   
    /**
     *检索查询,将结果集返回
     * @param searchkey
     * @param dbpath
     * @param searchfield
     * @return ArrayList
     */
    public ArrayList queryRecords(String searchkey,String dbpath,String searchfield){
       ArrayList list= null;
       try{
           Searcher searcher= new IndexSearcher(dbpath);
           Query query = QueryParser.parse(searchkey,searchfield,new StandardAnalyzer());
           Hits hits = searcher.search(query);
           if(hits!= null){
              list= new ArrayList();
              int temp_hitslength=hits.length();
              Document doc= null;
              for(int i=0;i<temp_hitslength;i++){
                  doc=hits.doc(i);
                  list.add(doc.get("filename"));
              }
           }
       }catch(Exception ex){
           ex.printStackTrace();
       }

       return list;
    }

    /**
     *
     * @param args
     */
    public static void main(String[]args) {

       QueryRecords temp= new QueryRecords();      
       ArrayList list= null;
       list=temp.queryRecords("nationally","d:\\lucene\\holendb","content");
       for(int i=0;i<list.size();i++){
           System.out.println((String)list.get(i));
       }
    }
}

然后在d:\lucene下建立3个文本文件,我的是holenalsdjflasdlfj.txt、holen1.txt、holen2.txt,在里面输入一些内容,有一个包含有"nationally"就可以了,这个就是我们要测试查询的字符串。
首先执行CreateDataBase.java(初始化库),然后InsertRecords.java(添加索引),最后QueryRecords.java(测试文件)
然后就可以看到正确的输出了。

:),就到这里,欢迎指正!!!!!!

阅读(2619) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册