lucene索引word/pdf/html/txt文件及检索(搜索引擎)

因为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个结果! " ); 
            }   
        }  
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值