• 利用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)

  • 相关阅读:
    SSL配置
    PHPStorm 打开时闪退的问题
    【网址链接】
    js中将string转换为number
    HTML特效代码大全
    前端面试题-重要
    元素框默认的计算方式
    html中有趣的显示出柠檬的方法
    html中圆角方法border-top-left-radius
    html+css显示出三角形方法transparent
  • 原文地址:https://www.cnblogs.com/fengweixin/p/3597961.html
Copyright © 2020-2023  润新知