正文

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(测试文件)然后就可以看到正确的输出了。:),就到这里,欢迎指正!!!!!!

阅读(2652) | 评论(0)


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

评论

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