利用Lucene将被索引文件目录中的所有文件建立索引

 

1、新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件。

2、新建解析目录中所有文件的类,用来解析指定目录下的所有文件。

import java.io.File;

public class FileList {
 private static final String SEP="/";
 private static StringBuffer sb=new StringBuffer("");
 public static String[] getFiles(File file){//取得file目录中所有的文件
  if(file.isDirectory()){//如果是目录则进一步迭代
   File[] fs=file.listFiles();
   for(int i=0;i<fs.length;i++){
    getFiles(fs[i]);
   }
  }
  else{
   sb.append(file.getPath()+SEP);//输出文件
  }
  String s=sb.toString();
  return s.split(SEP);
 }
 public static String[] getFiles(String path){
  File file=new File(path);
  if(file.isDirectory()){
   File[] fs=file.listFiles();
   for(int i=0;i<fs.length;i++){
    getFiles(fs[i]);
   }
  }
  else{
   sb.append(file.getPath()+SEP);
  }
  String s=sb.toString();
  return s.split(SEP);
 }
 public static String getExt(File file){
  String ext=file.getName();
  try {
   ext=ext.substring(ext.lastIndexOf(".")+1);
  } catch (Exception e) {
   ext="";
  }
  return ext;
 }
}

3、读取文件内容用来建立对此文件的索引,这里读取文件的所有字符,只支持文本文件,本文暂时没有对其他文档的支持,读者可以利用其他组件来解析其他复杂文档。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class FileText {
 public static String getText(File file){//获得文件的内容
  StringBuffer sb=new StringBuffer("");
  try {
   FileReader fr=new FileReader(file);
   BufferedReader br=new BufferedReader(fr);
   String text=br.readLine();
   while(text!=null){
    sb.append(text);
    text=br.readLine();
   }
   br.close();
  } catch (Exception e) {
   sb.append("");
  }
  return sb.toString();
 }
 public static String getText(String filename){
  File file=new File(filename);
  String text="";
  try {
   text=getText(file);
  } catch (Exception e) {
   text="";
  }
  return text;
 }
}

4、利用Lucene建立索引文件,同时存入指定目录。

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class LuceneIndexer {
 public void createIndex(String filesPath,String indexPath) throws IOException{
  File path=new File(indexPath);
  SimpleFSDirectory indexDir=new SimpleFSDirectory(path);//读取被索引的文件目录
  CJKAnalyzer analyzer=new CJKAnalyzer(Version.LUCENE_31);//创建一个二分法分析器
  IndexWriterConfig conf=new IndexWriterConfig(Version.LUCENE_31, analyzer);
  IndexWriter writer=new IndexWriter(indexDir,conf);
  String[] files=FileList.getFiles(filesPath);//读取被索引的文件
  for(int i=0;i<files.length;i++){
   File f=new File(files[i]);
   String ext=FileList.getExt(f);
   if(ext.equalsIgnoreCase("html")||ext.equalsIgnoreCase("htm")){//只建立网页文件的索引
    Document doc=new Document();//新建一个索引文件用于索引当前html文件
    //filename字段
    String filename=f.getName();
    Field field=new Field("filename",filename,Field.Store.YES,Field.Index.ANALYZED);
    doc.add(field);
    //uri字段
    String uri=f.getPath();
    field=new Field("uri",uri,Field.Store.YES,Field.Index.NO);
    doc.add(field);
    //cdate字段
    Date date=new Date(f.lastModified());
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd E");
    String cdate=sdf.format(date);
    field=new Field("cdate",cdate,Field.Store.YES,Field.Index.NO);
    doc.add(field);
    //size字段
    double si=f.length();
    String size="";
    if(si>1024){
     size=String.valueOf(Math.floor(si/1024))+"K";
    }
    else{
     size=String.valueOf(si)+"Bytes";
    }
    field=new Field("size",size,Field.Store.YES,Field.Index.NO);
    doc.add(field);
    //text字段
    String text=FileText.getText(f);
    field=new Field("text",text,Field.Store.YES,Field.Index.ANALYZED);
    doc.add(field);
    //digest字段
    String digest="";
    if(text.length()>200){
     digest=text.substring(0, 200);
    }
    else{
     digest=text;
    }
    field=new Field("digest",digest,Field.Store.YES,Field.Index.ANALYZED);
    doc.add(field);
    //归入索引
    writer.addDocument(doc);
   }
  }
  writer.close();//关闭索引器
  JOptionPane.showMessageDialog(null, "索引建立完毕!","提示", JOptionPane.INFORMATION_MESSAGE);
 }
}

5、测试

public class IndexerTest {

 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  LuceneIndexer indexer=new LuceneIndexer();
  try {
   indexer.createIndex("D:/我的文档/lucene/htm", "D:/我的文档/lucene/index");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

(转自:http://blog.sina.com.cn/s/blog_69b6a7c60100wa4n.html)

原文地址:https://www.cnblogs.com/fengweixin/p/3597961.html