用户名: 密 码:
您现在的位置:首页 >> SEO开发技巧 >> 内容

Lucene 2.9.0 索引 word pdf等不同的媒体文件算法

时间:2009/11/13 10:46:10 点击:7187

  核心提示:因为lucene索引的时候是将String型的信息建立索引的,所以这里必须是将word/pdf/html等文件的内容转化问字符型。 lucene的jar包自己去下载。 首先是建立索引的代码: public class TextFileIndexer {public static void main(...
因为lucene索引的时候是将String型的信息建立索引的,所以这里必须是将word/pdf/html等文件的内容转化问字符型。
lucene的jar包自己去下载。
首先是建立索引的代码:

public class TextFileIndexer {  
    public static void main(String[] args) throws Exception {  
        /* 指明要索引文件夹的位置,这里是d盘的s文件夹下 */ 
        File fileDir = new File("d:\\s");  
 
        /* 这里放索引文件的位置 */ 
        File indexDir = new File("d:\\index");  
        Analyzer luceneAnalyzer = new StandardAnalyzer();  
        IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,  
                true);  
        File[] textFiles = fileDir.listFiles();  
        long startTime = new Date().getTime();  
          
        //增加document到索引去    
                System.out.println("File正在被索引."); 
               
                /*
                 * 注意要变的就是这里,路径和读取文件的方法
                 * */
                String path ="d:\\s\\2.doc";
                String temp = ReadFile.readWord(path);
//                String path ="d:\\s\\index.htm";
//                String temp = ReadFile.readHtml(path);
                Document document = new Document();  
                Field FieldPath = new Field("path",path,
                        Field.Store.YES, Field.Index.NO);  
                Field FieldBody = new Field("body", temp, Field.Store.YES,  
                        Field.Index.TOKENIZED,  
                        Field.TermVector.WITH_POSITIONS_OFFSETS);  
                document.add(FieldPath);  
                document.add(FieldBody);  
                indexWriter.addDocument(document);  
            
         
        //optimize()方法是对索引进行优化  
        indexWriter.optimize();  
        indexWriter.close();  
          
        //测试一下索引的时间  
        long endTime = new Date().getTime();  
        System.out  
                .println("这花费了" 
                        + (endTime - startTime)  
                        + " 毫秒来把文档增加到索引里面去!" 
                        + fileDir.getPath());  
    } 
}
上面已经注释了要换的地方,我们要做的就是换文件的路径和读取文件的方法。

下面来具体看下读取文件的方法

1.首先来看WORD文档:
我这里用的是poi,相关jar包自己去下载,然后加到工程中(以下所要用的jar包也是,不再重复说)。

来看相关代码:
    public static String readWord(String path) {
        StringBuffer content = new StringBuffer("");// 文档内容
        try {

            HWPFDocument doc = new HWPFDocument(new FileInputStream(path));
            Range range = doc.getRange();
            int paragraphCount = range.numParagraphs();// 段落
            for (int i = 0; i < paragraphCount; i++) {// 遍历段落读取数据
                Paragraph pp = range.getParagraph(i);
                content.append(pp.text());
            }

        } catch (Exception e) {

        }
        return content.toString().trim();
    }
2.PDF文件用的是PDFbox:

public static String readPdf(String path) throws Exception {
        StringBuffer content = new StringBuffer("");// 文档内容
        FileInputStream fis = new FileInputStream(path);
        PDFParser p = new PDFParser(fis);
        p.parse();
        PDFTextStripper ts = new PDFTextStripper();
        content.append(ts.getText(p.getPDDocument()));
        fis.close();
        return content.toString().trim();
    }
3.html文件:

public static String readHtml(String urlString) {

        StringBuffer content = new StringBuffer("");
        File file = new File(urlString);
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            // 读取页面
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    fis,"utf-8"));//这里的字符编码要注意,要对上html头文件的一致,否则会出乱码
           
            String line = null;

            while ((line = reader.readLine()) != null) {
                content.append(line + "\n");
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        String contentString = content.toString();
        return contentString;
    }
4.txt文件:

public static String readTxt(String path) {
        StringBuffer content = new StringBuffer("");// 文档内容
        try {
            FileReader reader = new FileReader(path);
            BufferedReader br = new BufferedReader(reader);
            String s1 = null;

            while ((s1 = br.readLine()) != null) {
                content.append(s1 + "\r");
            }
            br.close();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content.toString().trim();
    }
接下来数搜索代码:

public class TestQuery {  
    public static void main(String[] args) throws IOException, ParseException {  
        Hits hits = null;  
        //搜索内容自己换
        String queryString = "根据国务院的决定";  
        Query query = null; 
       
        IndexSearcher searcher = new IndexSearcher("d:\\index"); //这里注意索引存放的路径
 
        Analyzer analyzer = new StandardAnalyzer();  
        try {  
            QueryParser qp = new QueryParser("body", analyzer);  
            /**
             * 建索引的时候我们指定了body建立为内容,我们搜索的时候也是针对body的,所以
             *   QueryParser qp = new QueryParser("body", analyzer);
             *   这句和建立索引时候
                Field FieldBody = new Field("body", temp, Field.Store.YES,  
                        Field.Index.TOKENIZED,  
                        Field.TermVector.WITH_POSITIONS_OFFSETS);
             *的这句的"body"是对应的。
             */
            query = qp.parse(queryString);  
        } catch (ParseException e) {
            System.out.println("异常");
        }  
        if (searcher != null) {  
            hits = searcher.search(query);  
            if (hits.length() > 0) {  
                System.out.println("找到:" + hits.length() + " 个结果!"); 
                for (int i = 0; i < hits.length(); i++) {//输出搜索信息
                     Document document = hits.doc(i);
                     System.out.println("contents:"+document.get("body"));
                     //同样原理这里的document.get("body")就是取得建立在索引文件里面的额body的所有内容
                     //你若想输出文件路径就用document.get("path")就可以了
                }
            } else{
                System.out.println("0个结果!");
            }  
        } 
    }

文章来源:http://www.xinxilong.com

作者:不详 来源:网络
相关评论
发表我的评论
  • 大名:
  • 内容:
  • 论坛群发大师(www.xinxilong.com) © 2008 版权所有 All Rights Resverved.
  • Email:4984672[at]qq.com 沪ICP备12025887号-1
  • Powered by 论坛群发大师